Какие символы должны быть экранированы в строке HTTP-запроса?
Этот вопрос касается символов в части строки запроса URL-адреса, которые появляются после?
пометить персонажа.
вВикипедиянекоторые символы остаются как есть, а другие кодируются (обычно%
escape escape)
Я пытался отследить это до фактических спецификаций, чтобы понять обоснование каждого пункта на этой странице Википедии.
Пример противоречия 1:
Спецификация HTML говорит кодировать пространство как+
и откладывает все остальноеRFC1738, Тем не менее, этот RFC говорит, что~
небезопасно и, кроме того, что «все небезопасные символы всегда должны быть закодированы в URL». Это, кажется, противоречит Википедии.
На практике IE8 кодирует~
в строках запроса это генерирует, в то время как FF3 оставляет это как есть.
Пример противоречия 2:
Википедия утверждает, что все символы, которые она не упоминает, должны быть закодированы.!
не упоминается в Википедии. НоRFC1738 говорится, что!
является «специальным» символом и «может использоваться без кодировки». Это, кажется, противоречит Википедии, которая говорит, что это должно быть закодировано.
На практике IE8 кодирует!
в строках запроса это генерирует, в то время как FF3 оставляет это как есть.
Я понимаю, что мораль этого, вероятно, будет заключаться в кодировании тех символов, которые находятся под сомнением между Википедией и спецификациями. Возможно, даже заходит так далеко, что кодирует все, что не является [A-Za-z0-9]. Я просто хотел бы знать фактические стандарты по этому вопросу.
Выводы
Алгоритм, описанный в Википедии, кодирует именно те символы, которые не являютсяRFC3986 незарезервированные символы, То есть он кодирует все символы, кроме буквенно-цифровых символов и-._~
, В особом случае пространство кодируется как+
вместо%20
согласно RFC3986.
Некоторые приложения используют более старый RFC. Для сравненияRFC2396 незарезервированные символы являются буквенно-цифровыми и!'()*-._~
.
Для сравненияАлгоритм рабочего проекта HTML5 кодирует все символы, кроме буквенно-цифровых символов и*-._
, Особый случай кодирования места остается+
, Заметные различия в том, что*
не кодируется и~
закодирован. (Технически, это обработка*
совместим с RFC3986, хотя*
вreserved
потому что это вsub-delims
которые разрешены вquery
производство.)