Разрешено ли URI (в частности, URL-адрес HTTP) содержать один или несколько пробелов? Если URL-адрес необходимо закодировать, является ли + просто общепринятым соглашением или законной альтернативой?
В частности, может ли кто-нибудь указать на RFC, который указывает, что URL-адрес с пробелом должен быть закодирован?
Мотивация для вопроса: Во время бета-тестирования веб-сайта я заметил, что некоторые URL-адреса были созданы с пробелами. Казалось, Firefox поступил правильно, что меня удивило! Но я хотел указать разработчикам на RFC, чтобы они почувствовали необходимость исправить эти URL-адреса.
Персонажи могут быть небезопасными по ряду причин. Пробел небезопасен, поскольку значимые пробелы могут исчезнуть, а незначащие пробелы могут появиться, когда URL-адреса транскрибируются, набираются или обрабатываются программами обработки текста. Символы "<" и ">" небезопасны, потому что они используется в качестве разделителей URL-адресов в произвольном тексте; кавычки (""") используются для разграничения URL-адресов в некоторых системах. Символ "#" небезопасен и всегда должен кодироваться, поскольку он используется во всемирной паутине и в других системах для отделения URL-адреса от идентификатора фрагмента / привязки, который может следовать за ним. Символ "%" небезопасен, потому что он используется для кодирования других символов. Другие символы небезопасны, поскольку известно, что шлюзы и другие транспортные агенты иногда изменяют такие символы. Это символы "{", "}", "|", "\", "^", "~", "[", "]" и "`".
Все небезопасные символы всегда должны кодироваться в URL. Например, символ "#" должен быть закодирован в URL-адресах даже в системах, которые обычно не работают с идентификаторами фрагментов или привязок, поэтому, если URL-адрес копируется в другую систему, которая их использует, не нужно будет изменять кодировку URL-адреса. .
Ответ 2 · рейтинг 44 · Julien
Почему его нужно кодировать? Запрос выглядит так:
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
Ответ 3 · рейтинг 41 · Peter Hilton
Короче ответ: нет, вы должны кодировать пробел; правильно кодировать пробел как +, но только в строке запроса; в пути вы должны использовать %20.
Ответ 4 · рейтинг 9 · Rob Williams
URL-адреса определены в RFC 3986, хотя другие RFC также актуальны, но RFC 1738 устарел.
В них может не быть пробелов, как и многих других символов. Поскольку эти запрещенные символы часто нужно каким-то образом представлять, существует схема их кодирования в URL-адрес путем перевода их в их шестнадцатеричный эквивалент ASCII с префиксом "%".
Большинство языков / платформ программирования предоставляют функции для кодирования и декодирования URL-адресов, хотя они могут не соответствовать стандартам RFC. Например, я знаю, что PHP этого не делает.
Ответ 5 · рейтинг 7 · user54650
Да, пробел обычно кодируется как "% 20". Любые параметры, которые передаются в URL, должны быть закодированы просто из соображений безопасности.
Ответ 6 · рейтинг 6 · A.M Web Surfer
URL-адрес может содержать пробел, и в большинстве браузеров они будут отображаться как% 20, но правила кодирования браузера меняются довольно часто, и мы не можем зависеть от того, как браузер будет отображать URL-адрес.
Так что вместо этого вы можете заменить пробел в URL-адресе любым символом, который, по вашему мнению, сделает URL-адрес более читабельным и "красивым";) ..... О, поэтому предпочтительными общими символами являются "-", "_", "+" .... но это не принуждение, поэтому вы можете использовать любой символ, который не должен быть в URL-адресе.
Избегайте использования%, &,}, {,], [, /,>, ‹в качестве замены символа пространства URL-адреса, поскольку они могут вызывать ошибку в определенных браузерах и платформах.
Как вы можете видеть, переполнение Stak использует символ "-" в качестве замены пробела (% 20).
Удачных вопросов.
Ответ 7 · рейтинг 5 · Chris Ballance
В URL-адресах не должно быть пробелов . Если вам нужно обратиться к одному из них, используйте его закодированное значение %20
Ответ 8 · рейтинг 5 · Julian Reschke
Может ли кто-нибудь указать на RFC, указывающий, что URL-адрес с пробелом должен быть закодирован?
URI и, следовательно, URL-адреса определены в RFC 3986.
Если вы посмотрите на определенную там грамматику, вы в конечном итоге заметите, что символ пробела никогда не может быть частью синтаксически допустимого URL-адреса, поэтому термин "URL-адрес с пробелом" сам по себе противоречит.
Ответ 9 · рейтинг 3 · Eric Schoonover
Чтобы ответить на ваш вопрос. Я бы сказал, что приложения довольно часто заменяют пробелы в значениях, которые будут использоваться в URL-адресах. Причина этого обычно заключается в том, чтобы избежать сложного для чтения процентного кодирования (URI).