Почему знак процента в URL вызывает ошибку HTTP 400 Bad Request?

22

Я случайно наткнулся на это, когда набрал неверный URL-адрес для веб-страницы в моем веб-браузере.

Почему при посещении http://example.com/%возникает ошибка HTTP 400 Bad Request? Ожидает ли сервер что-то еще после или до знака процента?

Похоже, это происходит для серверов Apache и Nginx.

iglvzx
источник

Ответы:

32

Краткий ответ

Согласно RFC 3986 , пустой %символ не является допустимым синтаксисом URI ; за ним должны следовать две значащие шестнадцатеричные цифры.

Длинный ответ

Полученный вами код статуса HTTP относится к 4xxклассу:

4xx: Client Error - The request contains bad syntax or cannot be fulfilled

Источник: Реестр кодов состояния протокола передачи гипертекста (HTTP)

В частности, код 400определен Инженерной рабочей группой по Интернету (IETF) в RFC 2616:

10.4.1 400 Неверный запрос

Сервер не может понять запрос из-за неправильного синтаксиса. Клиент НЕ ДОЛЖЕН повторять запрос без изменений.

Источник: RFC 2616 - Протокол передачи гипертекста - HTTP / 1.1

Цитирую Википедию (жирный акцент мой):

Символы, разрешенные в URI, являются зарезервированными или незарезервированными ( или символом процента как частью кодировки процента ).

Источник: процентное кодирование - процентное кодирование в URI

Если вы хотите , чтобы вставить буквальный %символ, вы должны использовать его процентный кодированное представление: %25.

дальнейшее чтение

and31415
источник
Я не понимаю Если я замаскирую знак «%» на «% 25», файл все равно не будет обработан, но в нашем сценарии возникнет ошибка 400 (Apache -> JKMount -> Tomcat)
fiffy
Если у вас есть следующий RewriteRule RewriteRule (.*) xyz/$1(где xyz - любое имя папки) в .htaccess, вы должны удвоить -encode% как% 2525.
Марко Марсала
9

Знак процента предназначен для вставки символа, который обычно не поддерживается в URL. Например,% 20 - это то же самое, что и пробел.

LPChip
источник
4
И чтобы вставить сам символ процента, это%25
Robotnik
A +- это быстрый способ кодирования пробела. Если вам нужен реальный знак плюс, используйте его шестнадцатеричный код% 2B.
Фил Перри
3
+ является правильной кодировкой для пробела только в строке запроса. % 20 - правильная кодировка в другом месте в URL.
Иден Таунсенд