Назад | Перейти на главную страницу

Мод Apache Rewrite

Я пытаюсь создать виртуальный поддомен, поскольку мой хостинг-провайдер установил ограничение на количество поддоменов, которые я могу иметь! У меня уже есть запись DNS с подстановочными знаками, поэтому все поддомены принимаются и отправляются в корень моего домена. Вот что я добавил в .htaccess для обработки перенаправления:

RewriteEngine on
RewriteCond %{HTTP_HOST} !^(www|admin).* [NC]
RewriteCond %{HTTP_HOST} ^([a-zA-Z0-9]+)\.domain\.-com
RewriteCond /home/username/public_html/subdomain/%1 -d
RewriteRule ^(.*) /home/username/public_html/subdomain/%1/$1

Проблема в последней строке, которая выполняет фактическое перенаправление, сервер показывает 500 (внутренняя ошибка сервера), но журнал ошибок apache не расширяет ошибку. На его место, если я поставлю что-то вроде:

RewriteRule ^(.*) index.php?path=/home/username/public_html/subdomain/%1/$1

Работает нормально ... И путь - это правильный путь к файлу.

Хотя уже поздно, но вот полный ответ на мой вопрос. Это очень удобный сценарий, если у вас когда-нибудь закончатся поддомены.

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{HTTP_HOST} !^[www|admin] [NC]
RewriteCond %{HTTP_HOST} ^([a-zA-Z0-9]+)\.domain\.com [NC]
RewriteRule (.*) /subdomain/%1/$1 [L]

Обратите внимание на фактический URL-адрес: http://virtual.domain.com/index.php будет http://www.domain.com/subdomain/virtual/index.php

Я бы посоветовал:

  • сначала проверьте, является ли это поддоменом (как и вы), и если да, сделайте свои тесты на / subdomain / (realsubdomain)
  • тогда, если это (www или admin), откажитесь от всего, что пытается получить доступ к / subdomain / xxx

Обратите внимание, что я удалил (/home/username/public_html)

Итак, это должно быть близко к:

RewriteEngine on
# first handle subdomains
RewriteCond %{HTTP_HOST} !^(www|admin)\.* [NC]
RewriteCond %{HTTP_HOST} ^([a-zA-Z0-9]+)\.domain\.com
RewriteCond /home/username/public_html/subdomain/%1 -d
RewriteRule (.*) /subdomain/%1/$1
# then in main domains:
RewriteCond %{HTTP_HOST} ^(www|admin)\.* [NC]
# ...refuse access to subdomain:
RewriteRule ^/subdomain(.*) - [R=404,L]

NB: это перенаправление 404, поэтому вы можете создать свой собственный 404 в самом начале переписывания, что-то вроде:

ErrorDocument 404 /404.php
RewriteEngine on
RewriteRule /404.php - [QSA,L]
... blabla...

И в вашем 404.php обработайте URL-адрес, чтобы отобразить красивое сообщение :)

Две подсказки:


Пожалуйста, попробуйте использовать RewriteLog директива: помогает отследить такие проблемы:

# Trace:
# (!) file gets big quickly, remove in prod environments:
RewriteLog "/web/logs/mywebsite.rewrite.log"
RewriteLogLevel 9
RewriteEngine On

Мой любимый инструмент для проверки регулярного выражения:

http://www.quanetic.com/Regex (не забудьте выбрать ereg (POSIX) вместо preg (PCRE)!)