Правило перезаписи не соответствует одинарным кавычкам - PullRequest
1 голос
/ 20 января 2010

Я задавал этот вопрос ранее:

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} экранирован, следовательно, несоответствие.Есть ли альтернатива одному из тех, которые я должен использовать?

Есть идеи, как переписать вышеуказанную строку, чтобы она также соответствовала строкам, содержащим ' символов?

Ответы [ 3 ]

0 голосов
/ 20 января 2010

Вы можете проверить флаг [NE] в конце RewriteRule.

0 голосов
/ 20 января 2010

После долгого времени, все выглядит хорошо:

RewriteMap unescape int:unescape

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{THE_REQUEST} ^.+\ (/[^?\s]*)\??([^\s]*)
RewriteCond %{REQUEST_URI}?%{QUERY_STRING}<${unescape:%1}?%2 ^([^<]*)<\1$
RewriteRule .* /pub/dispatch.php [L]
0 голосов
/ 20 января 2010

Попробуйте флаг C и объедините последовательность правил, к которой вы хотите применить правило. Так что на самом деле цепочка всех ваших правил.

...