是否允许URI(特别是HTTP URL)包含一个或多个空格字符?如果必须对URL 进行编码,+
这是通常遵循的约定还是合法的选择?
特别是,有人可以指向RFC指出必须对带有空格的URL 进行编码吗?
提出问题的动机:在对网站进行Beta测试时,我注意到某些URL的构造带有空格。Firefox似乎做对了,这让我感到惊讶!但是我希望能够将开发人员指向RFC,以便他们觉得有必要修复这些URL。
是否允许URI(特别是HTTP URL)包含一个或多个空格字符?如果必须对URL 进行编码,+
这是通常遵循的约定还是合法的选择?
特别是,有人可以指向RFC指出必须对带有空格的URL 进行编码吗?
提出问题的动机:在对网站进行Beta测试时,我注意到某些URL的构造带有空格。Firefox似乎做对了,这让我感到惊讶!但是我希望能够将开发人员指向RFC,以便他们觉得有必要修复这些URL。
Answers:
根据RFC 1738:
不安全:
出于多种原因,字符可能是不安全的。 空格字符是不安全的,因为在对URL进行转录或排版或对其进行文字处理程序处理时,可能会消失大量空格并且可能会引入无关紧要的空格。 字符
"<"
和">"
不安全,因为它们被用作自由文本中URL的分隔符;"""
在某些系统中,引号()用于分隔URL。该字符"#"
是不安全的,应始终进行编码,因为该字符在万维网和其他系统中用于从可能跟随其的片段/锚定标识符中分隔URL。人物"%"
不安全,因为它用于其他字符的编码。其他字符是不安全的,因为已知网关和其他传输代理有时会修改此类字符。这些字符是"{"
,"}"
,"|"
,"\"
,"^"
,"~"
,"["
,"]"
,和"`"
。所有不安全字符必须始终在URL中编码。例如,
"#"
即使在通常不处理片段或锚标识符的系统中,也必须在URL中对字符进行编码,因此,如果将URL复制到另一个使用它们的系统中,则无需更改URL编码。
为什么必须对其进行编码?请求看起来像这样:
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
简短的回答:不,您必须编码一个空格;将空格编码为,但仅在查询字符串中是正确的+
;在必须使用的路径中%20
。
URL中可以包含空格字符,并且在大多数浏览器中它们都将显示为%20,但是浏览器编码规则经常更改,因此我们不能依赖于浏览器如何显示URL。
因此,您可以用任何您认为会使URL更具可读性和'Pretty';).....的字符替换URL中的空格字符。因此,首选的通用字符为“-”,“ _”, “ +” ....但是这些不是强制性的,因此您可以使用URL中已经不应该使用的任何字符。
请避免使用%,&,},{,],[,/,>,<作为URL空间字符替换,因为它们可能会在某些浏览器和平台上引发错误。
如您所见,Stak溢出本身使用'-'字符作为空格(%20)替换。
祝您提问愉快。
有人可以指向RFC指出必须对带有空格的URL进行编码吗?
URI和URL是在RFC 3986中定义的。
如果您看一看那里定义的语法,您最终会注意到,空格字符永远不能成为语法上合法的URL的一部分,因此术语“带空格的URL”本身就是一个矛盾。
回答您的问题。我要说的是,应用程序替换将在URL中使用的值中的空格是相当普遍的。通常,这样做的原因是为了避免发生更难读取的百分比(URI)编码。
查看有关百分比编码的 Wikipedia文章。
Firefox 3将%20
在URL中的s在地址栏中显示为空格。
"Is a URL allowed to contain a space?"
。而是评论。