.htaccess Wildcard Redirect Исправление - PullRequest
3 голосов
/ 30 сентября 2011

Я использую следующий код для перенаправления субдоменов с подстановочными символами (* .domain.com) в их основную папку в / users и перенаправления прямых запросов в папку / users на версию субдомена:

Защита прямого доступа к доменным папкам с подстановочными знаками:

RewriteCond %{HTTP_HOST} ^www\.domain\.com$ [NC]
RewriteRule ^users/([a-z0-9\-_\.]+)/?(.*)$ http://$1.domain.com/$2 [QSA,NC,R,L]

Обрабатывать запросы поддомена с подстановочными знаками:

RewriteCond %{REQUEST_URI} !^/users/ [NC]
RewriteCond %{HTTP_HOST} ^(.+)\.domain\.com$ [NC]
RewriteCond %1 !=www [NC]
RewriteRule ^(.*)$ /users/%1/$1 [L]

Этот код работает достаточно хорошо, однако есть две проблемы, которые я не могу исправить.

  1. Представленный ниже сценарий, по-видимому, происходит из-за отсутствия косой черты в запрашивающем URI:

    username.domain.com / sub1 => username.domain.com/users/username/sub1 username.domain.com/sub1/ => username.domain.com/sub1/

  2. Доступ к каталогу пользователей по-прежнему возможен с помощью субдомена:

    username.domain.com / users / username / sub1 => Работает и не должен

Я в растерянности и буду очень признателен, если у кого-нибудь появятся идеи.

Спасибо!

1 Ответ

0 голосов
/ 13 октября 2011

Для проблемы 2, я думаю, что ваше первое правило защиты просто должно перенаправить все субдомены. Он перенаправляет www, но позволяет username.domain.com проходить как есть.

Это перенаправит любой запрос прямого доступа на путь пользователя.

RewriteCond %{HTTP_HOST} ^.+\.domain\.com$ [NC]
RewriteRule ^users/([a-z0-9\-_\.]+)/?(.*)$ http://$1.domain.com/$2 [QSA,NC,R,L]

Я думаю, что это может быть немного проще, просто найти любой хост, оканчивающийся на domain.com (который даже не обрабатывает субдомен, только domain.com) (я не проверял это ....)

RewriteCond %{HTTP_HOST} domain\.com$ [NC]
RewriteRule ^users/([a-z0-9\-_\.]+)/?(.*)$ http://$1.domain.com/$2 [QSA,NC,R,L]

Для проблемы 1 я тоже в тупике, извините. Он действует так, словно косая черта нарушает правила, поэтому проваливается как есть. Но я бы ожидал, что он будет делать так, как вы хотите:

username.domain.com / sub1 / => username.domain.com/users/username/sub1/

Возможно, попробуйте тег %{REQUEST_URI}, вместо того, чтобы пытаться захватить .*. Я не вижу разницы, но, возможно, это поможет.

RewriteCond %{REQUEST_URI} !^/users/ [NC]
RewriteCond %{HTTP_HOST} ^(.+)\.domain\.com$ [NC]
RewriteCond %1 !=www [NC]
RewriteRule .* /users/%1%{REQUEST_URI} [L]
...