Использование mod_rewrite для поддоменов - PullRequest
2 голосов
/ 31 июля 2009

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

Ответы [ 3 ]

2 голосов
/ 31 июля 2009

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', $_SERVER['HTTP_HOST'], $matches)) 
    return $matches[1];
}
0 голосов
/ 31 июля 2009

На самом деле, мы использовали эту технику без особых проблем в течение прошлого года. Наша конфигурация 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.

0 голосов
/ 31 июля 2009

Вы можете настроить 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 для приема всех поддоменов.

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

...