Несколько RewriteRules для одного RewriteCond в .htaccess - PullRequest
43 голосов
/ 28 августа 2011

В моем .htaccess есть следующая команда

    RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9-]+)\.example\.com [NC]
    RewriteRule ^(.*?)-([a-z]+) %2/$1.$2 [L]
    RewriteRule ^(.*?)-([0-9]+)([a-z]) %2/$1$3.$2 [L]

% 2 не работает во второй и последующих строках.Могу ли я определить любую переменную для% 2 и использовать ее во всех командах RewriteRule?Следующая команда работает

     RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9-]+)\.example\.com [NC]
     RewriteRule ^(.*?)-([a-z]+) %2/$1.$2 [L]
     RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9-]+)\.example\.com [NC]
     RewriteRule ^(.*?)-([0-9]+)([a-z]) %2/$1$3.$2 [L]

Но я хочу использовать% 2 для нескольких строк правил без дублирования условия.

Ответы [ 5 ]

57 голосов
/ 19 декабря 2012

Вы можете использовать флаг RewriteRule S|skip для привязки кратных RewriteRules к одному RewriteCond (или к набору RewriteConds). Вот пример, который применяет один Cond к трем Правилам:

RewriteCond  %{HTTP_HOST}  !^www.mydomain.com$
# skip rules if NOT within domain - only way to tie multiple rules to one cond
RewriteRule  .?  -  [S=3]
RewriteRule  ^path1(/.*)$  /otherpath1$1
RewriteRule  ^path2(/.*)$  /otherpath2$1
RewriteRule  ^path3(/.*)$  /otherpath3$1

Чтобы изменить существующий Cond для работы с несколькими правилами, вам необходимо:

  • Отрицание условия (добавьте его!)
  • Если у вас есть несколько RewriteConds:
    Измените логические AND в Conds на OR и наоборот.
  • Добавьте правило перезаписи пропуска перед всеми правилами, которые вы хотите связать с условием (ями). Установите для параметра S количество пропущенных строк правила.

Обратите внимание, что невозможно использовать какие-либо обратные ссылки, которые указывают на RewriteCond (например,% 1) в пропущенных Правилах. Они доступны только в пропускающем RewriteRule.

31 голосов
/ 19 июля 2012

Переменная должна быть сохранена как переменная Apache, тогда ее можно использовать без повторяющихся условий.

Сохранение в переменных Apache показано во второй строке.Использование сохраненных переменных в 3-й и 4-й строках.

RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9-]+)\.example\.com [NC]
RewriteRule .? - [E=Wa:%1,E=Wb:%2]
RewriteRule ^(.*?)-([a-z]+) %{ENV:Wb}/$1.%{ENV:Wb} [L]
RewriteRule ^(.*?)-([0-9]+)([a-z]) %{ENV:Wb}/$1$3.$2 [L]
7 голосов
/ 01 сентября 2013

Понятно, что это не очень весело, особенно когда дела растут и становятся более сложными.Однако есть менее известная опция оператора RewriteRule, которая сообщает apache пропустить следующее число N оператора RewriteRule.[S = N].Поэтому вместо того, чтобы каждый раз проверять, является ли запрос НЕ файлом и НЕ каталогом, мы могли бы сделать это: Блок кода

#
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .* - [S=3]
RewriteRule ^([^./]+)/$ http://www.santweb.co.uk/$1 [L]
RewriteRule ^([^./]+)/([^./]+)/$ http://www.santweb.co.uk/$1/$2 [L]
RewriteRule ^([^./]+)/([^./]+)/([^./]+)/$ http://www.santweb.co.uk/$1/$2/$3 [L]

#

Я нашел это из: http://www.sant -media.co.uk / 2010/03 / apply-rewritecond-to-multi-rewriterule-in-htaccess /

Я думаю, что это полезно

4 голосов
/ 28 августа 2011

Как правило, вы не можете использовать несколько операторов RewriteRule после одного RewriteCond.Но вы можете сделать небольшой трюк с вашими условиями, если хотите, как показано на:

https://serverfault.com/questions/162586/one-rewritecond-for-multiple-rewriterules
или
http://www.sant -media.co.uk / 2010/03/ применяя-RewriteCond к множественным RewriteRule-в-HTAccess /

3 голосов
/ 28 февраля 2019

В Apache 2.4 вы можете использовать директиву <If>:

RewriteEngine On
<If "%{HTTP:Upgrade} == 'websocket'">
    RewriteRule /nidoran/(.*)           ws://localhost:8080/nidoran/$1 [P,L]
    RewriteRule /kakuna/(.*)           ws://localhost:8081/kakuna/$1 [P,L]
    RewriteRule /porygon/(.*)           ws://localhost:8082/porygon/$1 [P,L]
</If>

http://httpd.apache.org/docs/2.4/expr.html#examples

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...