Вопрос

Я не хочу, чтобы люди могли регистрировать свои собственные разделы на моем сайте, и чтобы эти разделы были их собственным поддоменом на моем сайте. чтобы кто-то мог зарегистрировать «test» и сделать так, чтобы «test.example.com» ссылался на свой сайт, например, по адресу: /site.php?id=1. Как мне написать правило mod_rewrite для этого?

Это было полезно?

Решение

mod_rewrite может быть не лучшим инструментом для этого. RewriteRules отлично подходят для сопоставления файла с чем-то другим, но на самом деле он не предназначен для сопоставления доменов.

Лучшее, что вы можете сделать с помощью mod_rewrite , это следующее:

RewriteEngine On
# Skip www.domain.com
RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTP_HOST} ^([^.]+)\.domain\.com
RewriteRule ^/(.*)$  site.php?domain=%1&file=$1 [L]

Что не очень полезно. Что я бы порекомендовал сделать вместо этого, если программно проверить значение HTTP_HOST как таковое:

function get_subdomain() {
  if(preg_match('/^([^.]+)\.domain\.com/i', 

mod_rewrite может быть не лучшим инструментом для этого. RewriteRules отлично подходят для сопоставления файла с чем-то другим, но на самом деле он не предназначен для сопоставления доменов.

Лучшее, что вы можете сделать с помощью mod_rewrite , это следующее:

RewriteEngine On
# Skip www.domain.com
RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTP_HOST} ^([^.]+)\.domain\.com
RewriteRule ^/(.*)$  site.php?domain=%1&file=$1 [L]

Что не очень полезно. Что я бы порекомендовал сделать вместо этого, если программно проверить значение HTTP_HOST как таковое:

<*>SERVER['HTTP_HOST'], $matches)) return $matches[1]; }

Другие советы

Вы можете настроить apache для запроса " специального " домены в конфигурации apache (например, www.mydomain.com и т. д.), в контейнерах вашего виртуального хоста, а остальные по умолчанию используют ваш первый виртуальный хост. Затем вы можете переписать базовый URL-адрес в диспетчерское приложение, которое проверяет URL-адрес и отправляет пользователя в его правильную область.

Из документов Apache 2.0:

  

Может подойти практически любая директива Apache   в контейнер VirtualHost.   Первый раздел VirtualHost используется для   запросы без известного имени сервера.

Поместите код для обработки * .mydomain.com на первый виртуальный хост:

<VirtualHost *:80>
  Servername custom.mydomain.com
  DocumentRoot /var/www/html/custom
  RewriteEngine on
  RewriteRule ^/$ /var/www/cgi-bin/dispatch.cgi [R]
  # more configs here
</VirtualHost>

<VirtualHost *:80>
  Servername www.mydomain.com
  DocumentRoot /var/www/html/homepage
  # more configs here
</VirtualHost>

В dispatch.cgi проверьте вызывающий URL-адрес, чтобы определить, куда должен перейти пользователь. Убедитесь, что вы настроили DNS для приема всех поддоменов.

Надеюсь, это поможет!

На самом деле, мы использовали эту технику без особых проблем в течение прошлого года. Наша конфигурация mod_rewrite выглядит следующим образом:

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} !www.mydomain.com
RewriteCond %{HTTP_HOST} ^([^.]+)\.mydomain\.com
RewriteCond %{REQUEST_URI} !admin
RewriteRule (.*) /admin/ [R=301,L]
RewriteRule ^admin(.*)$ hosted/admin/$1 [QSA,L]

Что происходит, пользователи направляются на theiraccount.mydomain.com/admin.

Затем мы используем PHP для определения учетной записи домена. Использование чего-то вроде $ _SERVER ['SERVER_NAME'] или какого-либо метода получения доменного имени и его анализа работает очень хорошо.

Сохраните эти конфиги в httpd.conf, однако это станет проблемой процессора на сайтах с большим трафиком, если они будут храниться как .htaccess.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top