URL是否允许包含空格?


132

是否允许URI(特别是HTTP URL)包含一个或多个空格字符?如果必须对URL 进行编码,+这是通常遵循的约定还是合法的选择?

特别是,有人可以指向RFC指出必须对带有空格的URL 进行编码吗?

提出问题的动机:在对网站进行Beta测试时,我注意到某些URL的构造带有空格。Firefox似乎做对了,这让我感到惊讶!但是我希望能够将开发人员指向RFC,以便他们觉得有必要修复这些URL。



Answers:


101

根据RFC 1738

不安全:

出于多种原因,字符可能是不安全的。 空格字符是不安全的,因为在对URL进行转录或排版或对其进行文字处理程序处理时,可能会消失大量空格并且可能会引入无关紧要的空格。 字符"<"">"不安全,因为它们被用作自由文本中URL的分隔符;"""在某些系统中,引号()用于分隔URL。该字符"#"是不安全的,应始终进行编码,因为该字符在万维网和其他系统中用于从可能跟随其的片段/锚定标识符中分隔URL。人物"%"不安全,因为它用于其他字符的编码。其他字符是不安全的,因为已知网关和其他传输代理有时会修改此类字符。这些字符是"{""}""|""\""^""~""[""]",和"`"

所有不安全字符必须始终在URL中编码。例如,"#"即使在通常不处理片段或锚标识符的系统中,也必须在URL中对字符进行编码,因此,如果将URL复制到另一个使用它们的系统中,则无需更改URL编码。


2
1738被2396 取代。ietf.org/rfc/rfc2396.txt这是当前的Uri规范。不过在这种情况下也没关系。
Steve Severance

40
而2396已被3986所取代。由于RFC是不可变的,因此许多人会弄错这一点,因此不会告诉读者它们已被废弃。提示:请改用tools.ietf.org/html/rfcnnnn,例如tools.ietf.org/html/rfc2396,它会在顶部显示缺少的元数据。
朱利安·雷施克

43

为什么必须对其进行编码?请求看起来像这样:

GET /url HTTP/1.1
(Ignoring headers)

一共有3个字段,中间用空格隔开。如果您在网址中添加空格:

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 

如果var确实是“ foo + bar”而不是“ foo bar”怎么办?
Ivo3185 2015年

2
我认为这是传输层的要求,而不是URI规范本身。GET显然是http:规范的属性,而不是URL规范。同样,您可能会争辩网址中的引号“必须”被编码,因为否则网页可能会损坏。但这是HTML格式限制的属性(还有其他针对的策略),而不是URL规范的属性。
肯特·弗雷德里克

ietf.org/rfc/rfc1738.txt -不安全的字符,包括空格)应当被编码
于连

@KentFredric这很可能是表示层,而不是传输层。正如朱利安(几乎)所写,原始URI规范(RFC 1630)包含此限制,因此无论您的个人感觉如何,它都是URI规范本身的一部分。由于URI规范是 HTTP草案之后编写的,因此URI的设计很可能是考虑到HTTP的,包括禁止使用空格,但这并不重要,不是吗?事实是规格就是规格。
Christopher Schultz '18

38

简短的回答:不,您必须编码一个空格;将空格编码为,但仅在查询字符串中正确的+;在必须使用的路径中%20


1
嗨,我也很困惑,有时我看到这本书使用了“ +”,但有时却使用了“%20”,您能举一些例子吗?用户提交表单时,表单如何编码空间?与哪个角色?
GMsoF 2012年

1
有关其他详细信息,请参见此答案
DavidRR 2014年

片段/哈希部分呢?那里应该如何编码空格?
gumkins 2014年

@gumkins:片段(#及之后)未发送到服务器。实际上,您可以在任何地方使用%20或+来编码空格。
Julien 2015年

9

URL在RFC 3986中定义,尽管其他RFC也相关,但RFC 1738已过时。

它们中可能没有空格,还有许多其他字符。由于通常需要以某种方式表示那些禁止使用的字符,因此存在一种方案,可以通过将其转换为带有“%”前缀的ASCII十六进制等效项来将它们编码为URL。

尽管大多数编程语言/平台可能未正确遵循RFC标准,但它们提供了用于编码和解码URL的功能。例如,我知道PHP不会。


7

是的,尽管该空格通常被编码为“%20”。出于安全原因,传递给URL的所有参数都应进行编码。


6

URL中可以包含空格字符,并且在大多数浏览器中它们都将显示为%20,但是浏览器编码规则经常更改,因此我们不能依赖于浏览器如何显示URL。

因此,您可以用任何您认为会使URL更具可读性和'Pretty';).....的字符替换URL中的空格字符。因此,首选的通用字符为“-”,“ _”, “ +” ....但是这些不是强制性的,因此您可以使用URL中已经不应该使用的任何字符。

请避免使用%,&,},{,],[,/,>,<作为URL空间字符替换,因为它们可能会在某些浏览器和平台上引发错误。

如您所见,Stak溢出本身使用'-'字符作为空格(%20)替换。

祝您提问愉快。



5

有人可以指向RFC指出必须对带有空格的URL进行编码吗?

URI和URL是在RFC 3986中定义的。

如果您看一看那里定义的语法,您最终会注意到,空格字符永远不能成为语法上合法的URL的一部分,因此术语“带空格的URL”本身就是一个矛盾。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.