У меня есть версия сервера 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
я считаю, что это должно работать. Что я здесь делаю не так?
Пример кода в вашем вопросе сам по себе выглядит нормально, при условии:
У вас нет ИЛИ
флаг на предыдущем условии , который сделает следующее условие (которое исключает конкретный 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
затем
,
, применить подстановку .