Несколько 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/