Флаг NE mod_rewrite - Когда полезно кодировать специальные символы в URL? - PullRequest
13 голосов
/ 12 марта 2011

Я смотрел на флаг [NE] (noescape) в mod_rewrite.Подумав, я не смог понять ситуацию, когда я бы НЕ захотел использовать флаг.Это означает, что наиболее полезно сохранять флаг включенным почти в каждом RewriteRule.Отказ от использования этого флага вызвал у меня проблемы при некоторых обстоятельствах.

Большинство правил, с которыми я имею дело, - это перенаправления HTTP ([R]), а не прохождение.

Кто-нибудь сброситкакой-то свет в отношении , когда полезно, чтобы mod_rewrite кодировал URL?

Является ли вообще хорошей практикой включать этот флаг или использовать поведение по умолчанию, позволяющее mod_rewrite экранировать эти специальные символы?Почему?

Ответы [ 2 ]

3 голосов
/ 08 мая 2013

Если вы посмотрите на исходный код для mod_rewrite , вы заметите, что он устанавливает флаг proxy-nocanon, если noescape включен.

В версии где эта строка была впервые добавлена ​​, она также включала этот комментарий:

убедитесь, что mod_proxy_http не канонизирует URI, и сохраните любую (возможно, qsappend'd) строку запроса в имени файладля mod_proxy_http: proxy_http_canon ()

Исходя из этого, если вы прочитаете документацию mod_proxy , вы увидите следующее упоминание nocanon:

Обычно, mod_proxy канонизирует URL-адреса ProxyPassed.Но это может быть несовместимо с некоторыми бэкэндами, особенно теми, которые используют PATH_INFO.Необязательное ключевое слово nocanon подавляет это и передает URL-путь «raw» бэкэнду.Обратите внимание, что это может повлиять на безопасность вашего бэкэнда, поскольку снимает обычную ограниченную защиту от URL-атак, предоставляемых прокси.

Я могу ошибаться, но это подразумевает, чтоиспользование nocanon в mod_proxy (и расширение noescape в mod_rewrite) имеет потенциальные последствия для безопасности.Это объясняет, почему он отключен по умолчанию, хотя даже кажется, что в большинстве случаев было бы полезно включить его.

1 голос
/ 03 января 2013

Флаг [NE] чрезвычайно полезен, когда вы добавляете URL-адрес запроса как часть, скажем, подписи авторизации.

У меня только что была ошибка, когда авторизация работала с отключенным .htaccess, но не с включенным. Выяснилось, что причиной было то, что перенаправление было URL, кодирующим элементы, которые оказались в параметре php $_GET. Для устранения ошибки я изменил:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*[^/0-9])$ $1/ [R=301,L]

до

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*[^/0-9])$ $1/ [NE,R=301,L]

(подпись авторизации состоит из многих вещей, одним из которых является URL запроса)

...