Разрешено ли URL-адресу содержать пробел? - PullRequest
118 голосов
/ 31 января 2009

Разрешено ли URI (в частности, HTTP-URL) содержать один или несколько пробелов? Если URL должен быть закодирован, является ли + просто общепринятым соглашением или законной альтернативой?

В частности, может ли кто-то указать на RFC, который указывает, что URL с пробелом должен быть закодирован?

Мотивация для вопроса: Во время бета-тестирования веб-сайта я заметил, что некоторые URL были построены с пробелами в них. Firefox, похоже, поступил правильно, что меня удивило! Но я хотел иметь возможность указать разработчикам RFC, чтобы они чувствовали необходимость исправить эти URL.

Ответы [ 11 ]

92 голосов
/ 31 января 2009

Согласно RFC 1738 :

Опасное:

Символы могут быть небезопасными по ряду причин. Пространство символ небезопасен, потому что значительные пробелы могут исчезнуть и незначительные пробелы могут быть введены, когда URL транскрибируются или набирается или подвергается обработке текстовых программ. Символы "<" и ">" небезопасны, потому что они используются в качестве разделители вокруг URL в свободном тексте; знак кавычки (""") используется для Разделяйте URL-адреса в некоторых системах. Символ "#" небезопасен и должен всегда кодируется, потому что он используется в World Wide Web и в других системы для отделения URL-адреса от идентификатора фрагмента / якоря, который может следуй за этим. Символ "%" небезопасен, потому что он используется для кодировки других символов. Другие персонажи небезопасны, потому что Известно, что шлюзы и другие транспортные агенты иногда изменяют такие персонажи. Эти символы "{", "}", "|", "\", "^", "~", "[", "]" и "`".

Все небезопасные символы всегда должны быть закодированы в URL . За Например, символ "#" должен быть закодирован в URL даже в системы, которые обычно не имеют дело с фрагментом или якорем идентификаторы, так что если URL-адрес копируется в другую систему, которая действительно использует их, нет необходимости менять кодировку URL.

40 голосов
/ 31 января 2009

Почему это должно быть закодировано? Запрос выглядит так:

GET /url HTTP/1.1
(Ignoring headers)

Есть 3 поля, разделенные пробелом. Если вы вставите пробел в свой URL:

GET /url end_url HTTP/1.1

У вас есть 4 поля, HTTP-сервер сообщит вам, что это неверный запрос.

GET /url%20end_url HTTP/1.1

3 поля => действительный

Примечание: в строке запроса (после?) Пробел обычно кодируется как +

GET /url?var=foo+bar HTTP/1.1 

вместо

GET /url?var=foo%20bar HTTP/1.1 
29 голосов
/ 31 января 2009

Краткий ответ: нет, вы должны закодировать пробел; является правильным для кодирования пробела как +, но только в строке запроса; в пути вы должны использовать %20.

9 голосов
/ 31 января 2009

URL определены в RFC 3986 , хотя другие RFC также актуальны, но RFC 1738 устарело.

Они могут не содержать пробелов, как и многие другие символы. Поскольку эти запрещенные символы часто необходимо каким-либо образом представлять, существует схема для их кодирования в URL путем преобразования их в шестнадцатеричный эквивалент ASCII с префиксом «%».

Большинство языков / платформ программирования предоставляют функции для кодирования и декодирования URL-адресов, хотя они могут не соответствовать стандартам RFC. Например, я знаю, что PHP нет.

6 голосов
/ 24 июня 2012

URL может содержать пробел, и они будут отображаться как% 20 в большинстве браузеров, но правила кодирования браузера меняются довольно часто, и мы не можем зависеть от того, как браузер будет отображать URL.

Так что вместо этого вы можете заменить символ пробела в URL любым символом, который, по вашему мнению, сделает URL более читабельным и «красивым»;) ..... О, поэтому наиболее распространенными символами являются «-», « _ "," + ".... но это не принуждения, поэтому вы можете использовать любой символ, который уже не должен присутствовать в URL.

Пожалуйста, избегайте%, &,}, {,], [, /,>, <в качестве замены символов пространства URL, поскольку они могут вызвать ошибку в некоторых браузерах и платформах. </p>

Как вы можете видеть, переполнение Stak использует символ '-' вместо пробела (% 20).

Счастливого допроса.

5 голосов
/ 31 января 2009

Может ли кто-то указать на RFC, указывающий, что URL с пробелом должен быть закодирован?

URI и, следовательно, URL-адреса определены в RFC 3986.

Если вы посмотрите на грамматику, определенную там, вы в конечном итоге заметите, что символ пробела никогда не может быть частью синтаксически допустимого URL, поэтому термин «URL с пробелом» сам по себе является противоречием.

5 голосов
/ 31 января 2009

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

5 голосов
/ 31 января 2009

Да, пробел обычно кодируется как "% 20". Любые параметры, которые передаются на URL, должны быть закодированы просто из соображений безопасности.

4 голосов
/ 31 января 2009

Чтобы ответить на ваш вопрос. Я бы сказал, что приложения довольно часто заменяют пробелы в значениях, которые будут использоваться в URL. Причина этого обычно заключается в том, чтобы избежать более трудной для чтения кодировки процентов (URI), которая возникает.

Ознакомьтесь с этой статьей в Википедии о Процентное кодирование .

2 голосов
/ 31 января 2009

Firefox 3 будет отображать %20 s в URL как пробелы в адресной строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...