Несколько RewriteRules для одиночного RewriteCond в .htaccess

У меня есть следующая команда в моем .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 для нескольких строк правила без условия дублирования.

Ответ 1

Переменная должна быть сохранена как переменная 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]

Ответ 2

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

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.

Ответ 3

Ясно, что это не очень весело, особенно по мере того, как вещи растут и становятся более сложными. Тем не менее, существует менее известный вариант оператора 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/applying-rewritecond-to-multiple-rewriterule-in-htaccess/

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

Ответ 4

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

https://serverfault.com/info/162586/one-rewritecond-for-multiple-rewriterules
или
http://www.sant-media.co.uk/2010/03/applying-rewritecond-to-multiple-rewriterule-in-htaccess/