Является ли URL разрешено содержать пробел?

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

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

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

Ответ 1

Согласно RFC 1738:

Опасный:

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

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

Ответ 2

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

GET /url HTTP/1.1
(Ignoring headers)

Есть три поля, разделенные пробелом. Если вы разместите пробел в своем 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 

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

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

http://andrewu.co.uk/tools/uriencoder/

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

Ознакомьтесь с этой статьей wikipedia о Percent-encoding.

Ответ 8

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

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

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

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

У вас есть счастливый вопрос.

Ответ 9

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

Ответ 10

Firefox 3 отобразит %20 в URL-адресах как пробелы в адресной строке.

Ответ 11

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