Mod_rewrite NE flag - Когда полезно кодировать специальные символы в URL?

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

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

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

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

Ответ 1

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

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

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

После этого, если вы прочитаете mod_proxy documentation, вы увидите следующее упоминание nocanon:

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

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

Ответ 2

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

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

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

to

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

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