Использование mod_rewrite для поддоменов
-
06-07-2019 - |
Вопрос
Я не хочу, чтобы люди могли регистрировать свои собственные разделы на моем сайте, и чтобы эти разделы были их собственным поддоменом на моем сайте. чтобы кто-то мог зарегистрировать «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.