2009-01-31 720 views
107

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

特别是,有人能指向一个RFC,指出一个空格为的URL必须被编码?

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

+0

后来的超集:什么是所有无效字符:http://stackoverflow.com/questions/1547899/which-characters-make-a-url-invalid – 2014-08-29 13:54:38

+0

**相关:** [在一个URL中,应该使用%20还是+?编码空格](http://stackoverflow.com/q/1211229/1497596) – DavidRR 2014-09-17 12:42:30

回答

87

作为每RFC 1738

不安全:

字符可以是不安全的多种原因。 空格 字符不安全,因为重要空格可能会消失,并且在转录URL或 排版或受到文字处理程序的处理时可能会引入不重要的空格。 字符"<"">"是不安全的,因为它们被用作围绕自由文本的URL的 分隔符;引号(""")用于在某些系统中为 分隔URL。字符"#"是不安全的,应该 始终编码,因为它是在万维网和其他 系统用于从可能 跟随其后的代码/锚点标识符分隔开来的网址。字符"%"是不安全的,因为它用于 其他字符的编码。其他字符是不安全的,因为 网关和其他传输代理有时会修改 这样的字符。这些字符是"{""}""|""\""^""~""[""]""`"

所有不安全的字符必须总是一个URL内进行编码。例如,对于 示例,字符"#"必须在URL中进行编码,即使在 系统中也不会处理片段或锚定 标识符,因此如果将URL复制到另一个系统中,则 不需要使用它们更改网址编码。

+1

1738已被2396取代。 http://www.ietf.org/rfc/rfc2396.txt 这是当前的Uri规范。不过在这种情况下并不重要。 – 2009-01-31 19:14:21

+33

而2396已被3986所取代。 许多人认为这是错误的,因为RFC是不可变的,因此不会告诉读者它们已被废弃。 提示:使用http://tools.ietf.org/html/rfcnnnn,而不是http://tools.ietf.org/html/rfc2396,它会在顶部显示缺少的元数据。 – 2009-02-01 14:41:19

5

是的,虽然空间通常编码为“%20”。 为了安全起见,任何传递给URL的参数都应进行编码。

-3

还没有看到。也许你可以配置网络服务器来接受...

3

网址应该不是其中有空格。如果您需要解决此问题,请使用其编码值%20

2

Firefox 3将在地址栏中以空格显示%20 s。

4

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

看看这个维基百科文章关于Percent-encoding

9

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

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

大多数编程语言/平台都提供编码和解码URL的功能,尽管它们可能不能很好地遵守RFC标准。例如,我知道PHP没有。

26

较短的回答:不,你必须编码空间;它正确的编码空间为+,但只在查询字符串;在路径中您必须使用%20

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

注:在查询字符串(?之后),一个空间通常编码为+

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

而非

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

有人可以指向一个RFC,指出具有空格的URL必须是en编码?

的URI,因此网址,在RFC 3986.

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

4

URL可以对他们有一个空格字符,它们将显示为20%,在大多数的浏览器,但浏览器的编码规则经常改变,所以我们不能依靠浏览器将如何显示URL上。

因此,你可以替换与您认为应使URL更具可读性和“漂亮”的任何字符的URL中的空格字符;).....O所以首选的一般字符是“ - ”,“_”,“+”....但这些不是强制性的,所以你可以使用任何不应该在URL中的字符。

请避开%,&,},{,],[,/,>,<作为URL空格字符替换,因为它们可能会在某些浏览器和平台上产生错误。

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

有一个快乐的提问。

相关问题