Назад | Перейти на главную страницу

Остановить Apache от декодирования символов из URI для PATH_INFO

Я хочу, чтобы 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 массив.)