Можно ли в URL-адресе содержать пробел?

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

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

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


person Joe Casadonte    schedule 31.01.2009    source источник
comment
надмножество, появившееся позже: каковы все недопустимые символы: stackoverflow.com/questions/1547899/   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 29.08.2014
comment


Ответы (10)


Согласно RFC 1738:

Небезопасно:

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

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

person Marc Novakowski    schedule 31.01.2009
comment
1738 был заменен 2396. ietf.org/rfc/rfc2396.txt То есть текущая спецификация Uri. Но в данном случае это не имеет значения. - person Steve Severance; 31.01.2009
comment
А 2396 был заменен 3986. Многие люди ошибаются, поскольку RFC неизменяемы и, таким образом, не сообщают читателю, что они устарели. Подсказка: используйте tools.ietf.org/html/rfcnnnn, например tools.ietf.org/html/rfc2396 вместо этого отображает отсутствующие метаданные сверху. - person Julian Reschke; 01.02.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 
person Julien    schedule 31.01.2009
comment
Что, если var действительно будет foo + bar, а не foo bar? - person Ivo3185; 11.09.2015
comment
Я бы сказал, что это требование транспортного уровня, а не самой спецификации URI. GET явно является свойством спецификации http:, а не спецификации URL. Точно так же вы можете утверждать, что кавычки в URL-адресах должны быть закодированы, потому что в противном случае веб-страницы могут сломаться. Но это свойство ограничений форматирования HTML (против которых существуют другие стратегии), а не свойство спецификации URL. - person Kent Fredric; 23.01.2016
comment
ietf.org/rfc/rfc1738.txt - небезопасные символы, включая пробелы) должны быть закодированы - person Julien; 25.01.2016
comment
@KentFredric Это, скорее, уровень презентации, а не уровень транспорт. Как пишет (почти) Жюльен, исходная спецификация URI (RFC 1630) содержит это ограничение, поэтому оно является частью самой спецификации URI, независимо от ваших личных ощущений. Поскольку спецификация URI была написана после черновиков HTTP, вполне возможно, что URI были разработаны с учетом HTTP, включая запрет на использование пробелов, но на самом деле это не имеет значения, не так ли? Правда в том, что спецификация - это то, что есть спецификация. - person Christopher Schultz; 28.04.2018

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

person Peter Hilton    schedule 31.01.2009
comment
Привет, я тоже запутался, когда-то я видел, что книга использует +, но когда-то% 20, вы можете показать какой-нибудь пример для этого? Когда пользователь отправляет форму, как форма кодирует пространство? с каким персонажем? - person Sam YC; 07.11.2012
comment
Дополнительные сведения см. В этом ответе. - person DavidRR; 17.09.2014
comment
а как насчет фрагмента / хеш-части? Как там нужно кодировать пробелы? - person humkins; 19.12.2014
comment
@gumkins: фрагмент (# и после) не отправляется на сервер. На практике вы можете использовать% 20 ​​или + где угодно для кодирования пробела. - person Julien; 12.09.2015

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

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

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

person Rob Williams    schedule 31.01.2009

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

person user54650    schedule 31.01.2009

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

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

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

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

Удачных вопросов.

person A.M Web Surfer    schedule 24.06.2012

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

person Chris Ballance    schedule 31.01.2009

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

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

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

person Julian Reschke    schedule 31.01.2009

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

Прочтите эту статью в Википедии о процентном кодировании.

person Eric Schoonover    schedule 31.01.2009

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

person Sophie Alpert    schedule 31.01.2009
comment
Это неправильный ответ на довольно простой вопрос: "Is a URL allowed to contain a space?". Скорее комментарий. - person Roko C. Buljan; 23.07.2019