Пробелы в URL-адресах? [дубликат]


этот вопрос уже есть ответ здесь:

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 51

4 ответа:

URL-адрес не должен содержать дословное пространство. Он должен быть либо закодирован с помощью процент-кодирование или другая кодировка, которая использует URL-безопасные символы (как application / x-www-form-urlencoded использует + вместо %20 для помещения).

но является ли утверждение правильным или неправильным, зависит от интерпретации: синтаксически URI не должен содержать буквальное пространство и должен быть закодирован; семантически, а %20 это не пробел (очевидно), но это представляет пространство.

Они действительно дураки. Если вы посмотрите на RFC 3986 приложение A, вы увидите, что" пространство " просто не упоминается нигде в грамматике для определения URL. Поскольку это нигде не упоминается в грамматике, единственный способ кодировать пробел - это процентное кодирование (%20).

фактически, RFC даже утверждает, что пробелы являются разделителями и должны игнорироваться:

в некоторых случаях, дополнительные пробельные символы (пробелы, строки-брейки, вкладки и т. д.) мочь должны быть добавлены, чтобы сломать длинный URI через линии. Пробел должны быть проигнорированы, когда Ури извлекается.

и

для надежности программное обеспечение, которое принимает пользовательский URI, должно попытаться распознавать и удалять как разделители, так и встроенные пробелы.

Любопытно, что использование + как кодировка для пространства не упоминается в RFC, хотя он зарезервирован как суб-делиметр. Я подозреваю, что его использование либо просто соглашение, либо охватывается другим RFC (возможно, HTTP).

пробелы просто заменяются на "%20", например:

http://www.example.com/my%20beautiful%20page

информация там я думаю частично правильная:

это не правда. URL-адрес может использовать пробелы. Ничего не определяет, что пробел заменяется знаком+.

Как вы заметили, URL-адрес не может использовать пробелы. HTTP-запрос будет завинчен. Я не уверен, где + определено, хотя %20 стандартные.