Исключить путь из RewriteRule с помощью RewriteCond в Apache2

У меня есть версия сервера Apache 2.4.18 (Ubuntu) .

У меня есть условное RewriteRule , которое применяется к большей части моего сайта. Я хочу исключить из этой перезаписи пути, начинающиеся с / norewrite .

Перезапись выглядит так:

RewriteCond <condition 1>
RewriteCond <condition 2>
RewriteRule ^.*$ https://example.com [L]

Я пытался исключить / norewrite следующим образом:

RewriteCond <condition 1>
RewriteCond <condition 2>
RewriteCond %{REQUEST_URI} !^/norewrite
RewriteRule ^.*$ https://example.com [L]

I также пробовали разные синтаксисы, такие как ! / norewrite , ! norewrite и ! ^ \ / norewrite , но все эти адреса начинаются с / norewrite по-прежнему перезаписывается, когда выполняются два других условия.

После прочтения документации Apache для RewriteCond и RewriteRule я считаю, что это должно работать. Что я здесь делаю не так?

0
задан 13 June 2019 в 12:49
1 ответ

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

  • У вас нет ИЛИ флаг на предыдущем условии , который сделает следующее условие (которое исключает конкретный URL-путь) необязательным.

  • Эти директивы находятся на достаточно ранней стадии вашей конфигурации, чтобы избежать конфликтов с другими директивами mod_rewrite. Обратите внимание, что серверная переменная REQUEST_URI обновляется на месте, если у вас есть более ранние директивы, которые перезаписывают URL.

  • Нет конфликтующих mod_alias Redirect или RedirectMatch директивы, которые заменяют эти директивы mod_rewrite. Обратите внимание, что порядок не имеет значения; директивы mod_alias будут выполняться независимо.

 RewriteCond <условие 1>
RewriteCond <условие 2>
RewriteCond% {REQUEST_URI}! ^ / Norewrite
RewriteRule ^. * $ Https://example.com [L]
 

Обратите внимание, что указание абсолютного URL-адреса (схема + имя хоста) в подстановке RewriteRule неявно вызовет 302 (временное) внешнее перенаправление , а не «перезапись "как вы, кажется, подразумеваете. Если это должно быть «перенаправление», вы должны быть явным и включить флаг R - более читаемый и позволяет избежать потенциальных ошибок в будущем.

Незначительный момент, но вам также не хватает завершающей косой черты на конец абсолютного URL ( строка подстановки ). Если вы его опустите, то вы полагаетесь на то, что пользовательский агент добавляет косую черту в перенаправленный запрос (это должны делать все основные браузеры).

Если вы хотите исключить только один URL-путь, вам не нужен отдельное состояние. А поскольку в настоящее время вы ничего не делаете с шаблоном RewriteRule , более эффективно выполнять эту проверку в RewriteRule .

Например:

RewriteCond <condition 1>
RewriteCond <condition 2>
RewriteRule !^/?norewrite https://example.com/ [R=302,L]

NB: последний RewriteCond никогда не должен иметь флаг OR , в противном случае правило будет выполняться безоговорочно. (По сути, он обрабатывается как ... ИЛИ истина .)

Сначала обрабатывается шаблон RewriteRule , поэтому выше указано, что для всех URL-путей, которые не start / norewrite затем , , применить подстановку .

1
ответ дан 4 December 2019 в 15:41

Теги

Похожие вопросы