是否允许包含空格的URL?

时间:2009-01-31 01:02:48

标签: html http url encoding

是否允许URI(特别是HTTP URL)包含一个或多个空格字符?如果网址必须被编码,+只是一个常用的约定,还是合法的替代?

特别是,有人可以指向一个RFC,表明带有空格的网址必须进行编码吗?

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

11 个答案:

答案 0 :(得分:91)

根据RFC 1738

  

不安全:

     

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

     

所有不安全的字符必须始终在网址中进行编码。对于      例如,字符"#"必须在URL中编码,即使在      通常不处理片段或锚点的系统      标识符,以便将URL复制到另一个系统中      确实使用它们,没有必要更改URL编码。

答案 1 :(得分:40)

为什么必须编码?请求如下所示:

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个字段=&gt;有效

注意:在查询字符串中(在?之后),空格通常编码为+

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

而不是

GET /url?var=foo%20bar HTTP/1.1 

答案 2 :(得分:29)

答案较短:不,你必须编码一个空格; 是否正确将空格编码为+,但仅限于查询字符串;在路径中,您必须使用%20

答案 3 :(得分:9)

网址在RFC 3986中定义,但其他RFC也相关,但RFC 1738已过时。

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

大多数编程语言/平台都提供编码和解码URL的功能,但它们可能无法正确遵守RFC标准。例如,我知道PHP没有。

答案 4 :(得分:6)

URL中可以包含空格字符,并且在大多数浏览器中它们将显示为%20,但浏览器编码规则经常更改,我们无法依赖浏览器显示网址的方式。

所以相反,你可以用你认为会使URL更可读和'漂亮'的任何字符替换URL中的空格字符;)......所以首选的一般字符是“ - ”,“ _“,”+“......但这些不是强迫性的,所以你可以使用任何不应该在URL中的角色。

请避开%,&amp;,},{,],[,/,&gt;,&lt;作为URL空间字符替换,因为它们可以在某些浏览器和平台上引发错误。

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

有一个快乐的问题。

答案 5 :(得分:5)

是的,空格通常编码为“%20”。 传输到URL的任何参数都应该进行编码,只是为了安全起见。

答案 6 :(得分:5)

网址中有空格。如果您需要解决一个问题,请使用其编码值%20

答案 7 :(得分:5)

  

有人可以指向RFC,表明必须对带空格的网址进行编码吗?

URI和URL因此在RFC 3986中定义。

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

答案 8 :(得分:4)

回答你的问题。我会说应用程序替换将在URL中使用的值中的空格是相当常见的。这样做的原因是为了避免发生更难以读取的百分比(URI)编码。

查看此维基百科关于Percent-encoding的文章。

答案 9 :(得分:2)

Firefox 3会在URL中显示%20作为地址栏中的空格。

答案 10 :(得分:-3)

没见过。也许您可以将Web服务器配置为接受...