Я хочу, чтобы Apache не декодировал %2B
(+
) и %3D
(=
) из URI. Мне нужны эти символы, не декодированные в PATH_INFO.
Я сделал это для %2F
(/
) используя:
AllowEncodedSlashes NoDecode
Но я не могу найти никаких директив, которые могли бы помочь мне сделать то же самое для других закодированных символов. Это вообще возможно?
Вы не можете запретить Apache декодировать эти% -кодированные символы в PATH_INFO
Переменная сервера Apache (которую PHP назначает позже $_SERVER['PATH_INFO']
суперглобальный, на первый взгляд неизменный).
В AllowEncodedSlashes
директива - это особый случай. Это действительно «средство безопасности». По умолчанию закодированная косая черта (%2F
) в части пути URL-адреса запускает система сгенерирована 404 ответ. В AllowEncodedSlashes
директива позволяет запросу пройти к приложению ( NoDecode
опция была добавлена позже).
Если вы хотите прочитать закодированный в% PATH_INFO
в PHP рассмотрите возможность использования другого $_SERVER
вместо этого переменная, например $_SERVER['REQUEST_URI']
, который не% -декодирован, но для этого потребуется дополнительный анализ. (Обратите внимание, что суперглобальный $_SERVER['REQUEST_URI']
отличается от переменной сервера Apache с тем же именем, которая декодируется% и может полностью ссылаться на другой URL-адрес, если URL-адрес перезаписывается!)
Однако, если вы хотите прочитать%-закодированные PATH_INFO
с Apache (используя mod_rewrite), рассмотрите возможность синтаксического анализа THE_REQUEST
вместо этого серверная переменная, которая содержит весь заголовок запроса, отправленный от клиента. Эта переменная не расшифровывается%. Это может быть присвоено переменной среды или даже параметру URL-адреса и прочитано PHP таким образом. (Обратите внимание, что QUERY_STRING
переменная сервера и соответствующая $_SERVER['QUERY_STRING']
суперглобальные, не декодируются%, но PHP декодирует значения отдельных параметров в $_GET
массив.)