LINUX.ORG.RU
ФорумAdmin

Редирект в apache. Тонкости

 , ,


1

1

Объясните по редиректу в Apache.
Допустим я хочу редиректить с http://site.ru на http://linux.org.ru. Я подключаю модуль mod_rewrite и создаю в директории виртуального хоста site.ru файл .htaccess со следующими директивами:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^site\.ru$ [NC]
RewriteRule (.*) http://linux.org.ru$1 [R=301]
RewriteCond указывает условие, RewriteRule - цель. В условии я задаю проверять по http-заголовку HTTP_HOST, выражение заключается между симфолами ^ и $, точки экранируются бэкслэшами, NC - флаг, указывающий не учитывать регистр, вроде понятно. В цели скобки со звёздочкой говорят, чтобы правило срабатывало и для поддоменов в том числе, экранирование точек не используется, $1 стоит непонятно зачем, флаг R=301 - сообщать клиенту код 301 - редирект, понятно, но не очень.
А теперь представьте, что у меня есть 50 алиасов к сайту site.ru, как сделать редирект со всех алиасов, не указывая их при этом?

★★★★★

В цели скобки со звёздочкой говорят, чтобы правило срабатывало и для поддоменов в том числе

Нет, скобки используются для того, чтобы совпавшую строку использовать в подстановке дальше.

$1 стоит непонятно зачем

Вместо $1 подставится то, что попало под регулярку в скобках.

А теперь представьте, что у меня есть 50 алиасов к сайту site.ru, как сделать редирект со всех алиасов, не указывая их при этом?

RewriteCond %{HTTP_HOST} !^site\.ru$ [NC]
Deleted ()
Ответ на: комментарий от Deleted

Не понимаю чем ваше правило отличается от моего? Только одним восклицательным знаком?
Под алиасами я имел в виду. что у меня много виртхостов (например site.ru, site1.org, site2.org) и в каждом DocumentRoot указывает на один каталог, то есть и .htaccess у них - общий. А редиректить надо на другой сервер, например на linux.org.ru.

Нет, скобки используются для того, чтобы совпавшую строку использовать в подстановке дальше.

Вместо $1 подставится то, что попало под регулярку в скобках.

А, понял. Ну да, правильно, URL, на который редирект идёт, должен естественно содержать не только имя домена, но и путь, то есть всё что после первого слэша. Тогда почему в скобках точка, а не слэш? Видимо я не совсем понимаю как регулярка из RewriteCond передаётся в RewriteRule.

sunny1983 ★★★★★ ()
Ответ на: комментарий от sunny1983
RewriteCond %{HTTP_HOST} !^linux\.og\.ru$ [NC]
RewriteRule (.*) http://linux.org.ru$1 [R=301]

Так понятнее?

Тогда почему в скобках точка, а не слэш?

.* - это регулярка, под которую попадает весь uri.

как регулярка из RewriteCond передаётся в RewriteRule

Никак.

Deleted ()

представьте, что у меня есть 50 алиасов к сайту site.ru

Это лишь изящный штрих к диагнозу, выставляемому по попытке сделать 301й редирект при помощи мод_рерайта и неспособности к RTFM'у в целом.

thesis ★★★★★ ()
Ответ на: комментарий от Deleted

Что-то не работает редирект. Как проверить .htaccess вообще обрабатывается или нет? access_log показывает, что apache вместо 301 стандартный 200 код выдаёт:

217.65.???.??? - - [21/Apr/2017:04:38:54 +0000] "GET / HTTP/1.1" 200 56

sunny1983 ★★★★★ ()
Последнее исправление: sunny1983 (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.