Пробелы в URL-адресах? [дубликат]
этот вопрос уже есть ответ здесь:
- URL-адрес может содержать пробел? 11 ответов
w3fools утверждает, что URL-адреса могут содержать пробелы: http://w3fools.com/#html_urlencode
- Это правда? Как URL-адрес может содержать некодированное пространство?
Я под впечатлением строка запроса HTTP-запроса использует пробел в качестве разделителя, будучи отформатирован как {the method}{space}{the path}{space}{the protocol}
:
GET /index.html http/1.1
поэтому как URL-адрес может содержать пробел? Если это возможно, то откуда взялась практика замены пробелов на +
откуда?
4 ответа:
URL-адрес не должен содержать дословное пространство. Он должен быть либо закодирован с помощью процент-кодирование или другая кодировка, которая использует URL-безопасные символы (как application / x-www-form-urlencoded использует
+
вместо%20
для помещения).но является ли утверждение правильным или неправильным, зависит от интерпретации: синтаксически URI не должен содержать буквальное пространство и должен быть закодирован; семантически, а
%20
это не пробел (очевидно), но это представляет пространство.
Они действительно дураки. Если вы посмотрите на RFC 3986 приложение A, вы увидите, что" пространство " просто не упоминается нигде в грамматике для определения URL. Поскольку это нигде не упоминается в грамматике, единственный способ кодировать пробел - это процентное кодирование (
%20
).фактически, RFC даже утверждает, что пробелы являются разделителями и должны игнорироваться:
в некоторых случаях, дополнительные пробельные символы (пробелы, строки-брейки, вкладки и т. д.) мочь должны быть добавлены, чтобы сломать длинный URI через линии. Пробел должны быть проигнорированы, когда Ури извлекается.
и
для надежности программное обеспечение, которое принимает пользовательский URI, должно попытаться распознавать и удалять как разделители, так и встроенные пробелы.
Любопытно, что использование
+
как кодировка для пространства не упоминается в RFC, хотя он зарезервирован как суб-делиметр. Я подозреваю, что его использование либо просто соглашение, либо охватывается другим RFC (возможно, HTTP).