2015-02-04 3 views
1

Может ли кто-нибудь объяснить, как работает скрипт mod_rewrite? Цель состоит в том, чтобы поймать доступ к probe.com, который не имеет ничего за ним и перенаправляет его на probewebsites.com. Если доступ к probe.com/anything, такой как probe.com/register.php, доступ остается на сайте probe.com, в этом случае доступ к сайту probe.com/register.php.Попытка понять скрипт mod_rewrite

Сценарий работает, я просто не знаю, как это сделать.

Я вижу, что линия 2 ищет доступ к probe.com. Затем строка 3 как-то проверяет, что ничего не следует за probe.com. Строка 4 выглядит так, будто она собирает обратную ссылку, но она никогда не используется. Спасибо за любую помощь.

1. RewriteEngine on 
2. RewriteCond %{HTTP_HOST} probe\.com [NC] 
3. RewriteCond %{REQUEST_URI} ^/$ 
4. Rewriterule ^(.*)$ http://probewebsites.com/ [L,R=301] 

ответ

2

Ваше общее понимание правил верное. Позвольте мне подробно остановиться на этом.

RewriteEngine on 

Включает обработку правил mod-rewrite для этого каталога.

RewriteCond %{HTTP_HOST} probe.com [NC] 

Похоже, он ищет probe.com, но это не так. Так как это шаблон регулярного выражения, . будет соответствовать любому персонажу. Итак, probeXcom также пройдет; и поскольку не определены границы регулярных выражений (^, $), он становится совпадением подстроки. Это означает, что csi.probe.com или probe.com.uk также совпадают. Правильная модель, чтобы соответствовать только probe.com или www.probe.com бы

RewriteCond %{HTTP_HOST} ^(www\.)?probe\.com$ [NC] 

^ и $ матч на начальной и конечной границы %{HTTP_HOST}, который относится к заголовку HTTP одним и тем же именем. \. избегает совпадения регулярных выражений . и начинает сопоставлять буквальную точку . персонажа. Вопросительный знак в (www\.)? делает захваченный www. необязательным. Наконец, [NC] обозначает нет случая и делает тест нечувствительным к регистру.

RewriteCond %{REQUEST_URI} ^/$ 

Это состояние на самом деле не требуется, потому что вы можете сделать то же матч в самом RewriteRule. Таким образом, новое правило должно выглядеть следующим

RewriteRule ^$ http://probewebsites.com/ [R=301,L] 

Обратите внимание, что это не ^/$ и это не опечатка. Образец RewriteRule соответствует пути к каталогу, но не содержит ведущего /, как в %{REQUEST_URI}.

[L] отмечает правило как Последнее, так как мы перенаправляем в любом случае, который указан [R=301]. Код состояния 301 указывает браузеру, что это перенаправление является постоянным, и поэтому браузер будет кэшировать его. Если вы укажете только [R], сервер сделает 302временно переведенным перенаправлением.

Итак, ваш финал.htacces должен выглядеть

RewriteEngine on 

RewriteCond %{HTTP_HOST} ^(www\.)?probe\.com$ [NC] 
RewriteRule ^$ http://probewebsites.com/ [R=301,L] 
+0

быстрый вопрос в этой строке 'RewriteCond% {HTTP_HOST}^(WWW \.)? пробник \ .com $ [NC]' Вы не используете ехр '(WWW \.)' как backreference, так и цель '()' здесь просто группировать 'www \ .', поэтому'? 'относится к сегменту' www \ .'? Кроме того, существует ли способ группировки 'www \ .' без использования'() 'i.e, если вы явно не хотите, чтобы сегмент был выбран в качестве обратной ссылки? –

+0

Хороший вопрос. Да, это цель состоит в том, чтобы сгруппировать эту последовательность символов так, чтобы следующий '?' Делает ее опциональной, но в качестве побочного эффекта она также подбирается как обратная ссылка. Если вы не хотите забирать его в качестве обратной ссылки, запустите группу как '(?: Www \.)?'. Последовательность символов '?:' В начале делает его неотправленной группой. –

+0

Спасибо за объяснение. Но если запрос, который пришел, был probe.com/register.php, как это может привести к тому, что он не будет перенаправлен на probewebsites.com/register.php? – Steve

Смежные вопросы