Я задавал этот вопрос ранее:
mod_rewrite: соответствовать, только если не найдено ни одного предыдущего правила?
И какое-то время успешно пользовались предлагаемым решением с успехомсейчас:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{THE_REQUEST} ^.+\ (/[^?\s]*)\??([^\s]*)
RewriteCond %{REQUEST_URI}?%{QUERY_STRING}<%1?%2 ^([^<]*)<\1$
RewriteRule .* /pub/dispatch.php [L]
Однако с тех пор мы обнаружили, что это правило не выполняется для URL-адресов, содержащих символы одинарных кавычек, например http://example.com/don't_do_it
(который фактически запрашивается как http://example.com/don%27t_do_it
)
Специальноэта строка не соответствует:
RewriteCond %{REQUEST_URI}?%{QUERY_STRING}<%1?%2 ^([^<]*)<\1$
комментирование приводит к тому, что правило соответствует ожидаемому, но нарушает поведение «соответствовать, только если ни одно из предыдущих правил не соответствует».Вероятно, это связано с тем, что '
urlen-кодируется в %27
.
Вот соответствующая запись RewriteLog (для url /asdf'asdf
aka /asdf%27asdf
):
RewriteCond: input='/asdf'asdf?</asdf%27asdf?' pattern='^([^<]*)<\1$' => not-matched
Здесь я вижу, что% {REQUEST_URI} не экранирован, а% {QUERY_STRING} экранирован, следовательно, несоответствие.Есть ли альтернатива одному из тех, которые я должен использовать?
Есть идеи, как переписать вышеуказанную строку, чтобы она также соответствовала строкам, содержащим '
символов?