Ваше общее понимание правил верное. Позвольте мне подробно остановиться на этом.
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]
быстрый вопрос в этой строке 'RewriteCond% {HTTP_HOST}^(WWW \.)? пробник \ .com $ [NC]' Вы не используете ехр '(WWW \.)' как backreference, так и цель '()' здесь просто группировать 'www \ .', поэтому'? 'относится к сегменту' www \ .'? Кроме того, существует ли способ группировки 'www \ .' без использования'() 'i.e, если вы явно не хотите, чтобы сегмент был выбран в качестве обратной ссылки? –
Хороший вопрос. Да, это цель состоит в том, чтобы сгруппировать эту последовательность символов так, чтобы следующий '?' Делает ее опциональной, но в качестве побочного эффекта она также подбирается как обратная ссылка. Если вы не хотите забирать его в качестве обратной ссылки, запустите группу как '(?: Www \.)?'. Последовательность символов '?:' В начале делает его неотправленной группой. –
Спасибо за объяснение. Но если запрос, который пришел, был probe.com/register.php, как это может привести к тому, что он не будет перенаправлен на probewebsites.com/register.php? – Steve