Совпадение HTTP_HOST в RewriteRule вместо использования RewriteCond - PullRequest
1 голос
/ 26 ноября 2010

У меня есть куча 301 перенаправлений, которые мне нужно сделать, которые содержат разные домены из одного и того же файла .htaccess.Я мог бы написать RewriteCond для каждого правила, как показано ниже, и он прекрасно работает:

RewriteCond %{HTTP_HOST} www.domain1.com [NC]
RewriteRule old-url-1a.htm /new-url-1a [L,R=301]

RewriteCond %{HTTP_HOST} www.domain1.com [NC]
RewriteRule old-url-1b.htm /new-url-1b [L,R=301]

RewriteCond %{HTTP_HOST} www.domain2.com [NC]
RewriteRule old-url-2a.htm /new-url-2a [L,R=301]

RewriteCond %{HTTP_HOST} www.domain2.com [NC]
RewriteRule old-url-2b.htm /new-url-2b [L,R=301]

Но при использовании этого метода мне нужно иметь 2 строки кода для каждого отдельного URL, который становится очень длинным и повторяющимся (тот же RewriteCondповторяется много раз).Можно ли как-то сопоставить HTTP_HOST из самой директивы RewriteRule?Что-то вроде этого (концептуально):

RewriteRule www.domain1.com/old-url-1a.htm /new-url-1a [L,R=301]
RewriteRule www.domain1.com/old-url-1b.htm /new-url-1b [L,R=301]

RewriteRule www.domain2.com/old-url-2a.htm /new-url-2a [L,R=301]
RewriteRule www.domain2.com/old-url-2b.htm /new-url-2b [L,R=301]

Спасибо.

Ответы [ 2 ]

2 голосов
/ 26 ноября 2010

В документации Apache говорится о RewriteRule:

Что сопоставляется?

Шаблон будет первоначально сопоставляться с частью URL после имени хоста и порта, а также передСтрока запроса. Если вы хотите сопоставить имя хоста , порт или строку запроса, используйте RewriteCond с переменными% {HTTP_HOST} ,% {SERVER_PORT} или% {QUERY_STRING} соответственно.

Но если вы можете поместить правила в свой apache-config, есть еще один способ сокращения: вы можете использовать RewriteMap.

RewriteMap     host-redirects   txt:/etc/apache2/host-redirects.map
RewriteRule ^/([^/]*).htm$ http://%{HTTP_HOST}/${host-redirects:%{HTTP_HOST}/$1|$1} [R,L]

Перенаправление хоста.карта будет выглядеть так:

www.domain1.com/old-url-1a.htm /new-url-1a/
www.domain1.com/old-url-1b.htm /new-url-1b/
www.domain2.com/old-url-2a.htm /new-url-2a/
1 голос
/ 26 ноября 2010

BTW mapping может быть единственным способом отладки «что действительно соответствует»

Вы можете установить RewriteLogLevel на 9, журналы не показывают, что анализируется с RewriteCond.
Вместо этого он говорит, «соответствует» или нет. Не очень полезно .

При использовании карт (RewriteMap) в журналах четко указывается, какой ключ передан. Пример:
(/var/log/http/rewrite.log) map lookup OK: map=host-redirects[txt] key=WHAT_IS_PARSED -> WHAT_IS_RETURNED
или
map lookup FAILED: map=host-redirects[txt] key=WHAT_IS_PARSED

Используя RewriteRule, правильный термин после | обозначает возвращаемое значение по умолчанию.
В большинстве случаев это страница по умолчанию 404.html или несколько. Очень полезно .

Итак, в вашем httpd.conf установите
RewriteLog logs/rewrite.log RewriteLofLevel 9
в вашем виртуальном хосте, и все готово:)

...