URL 是否允许包含空格?

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

特别是,是否有人可以指向一个 RFC,该 RFC 指示对包含空格 必须的的 URL 进行编码?

问题的动机: 在测试一个网站的时候,我注意到一些 URL 是用空格构建的。Firefox 似乎做了正确的事情,这让我很惊讶!但是我希望能够为开发人员指出 RFC,这样他们就会觉得需要修复这些 URL。

259878 次浏览

是的,但是空间通常被编码为“% 20”。 为了安全起见,应该对传递到 URL 的任何参数进行编码。

Url 应该在 没有中有空格。如果您需要寻址一个这样做,使用它的编码值 %20

Firefox3将在 URL 中显示 %20作为地址栏中的空格。

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

看看这篇关于 百分号编码的维基百科文章。

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

他们可能没有空格在他们,以及许多其他字符。由于这些被禁止的字符通常需要以某种方式表示,所以有一种方案可以将它们编码成一个 URL,将它们翻译成具有“%”前缀的等价的 ASCII 十六进制字符。

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

根据 RFC 1738:

不安全:

字符不安全的原因有很多。 < strong > 空格 字符是不安全的,因为重要的空间可能消失和 当 URL 被转录或者 排版或经过文字处理程序的处理。 字符 "<"">"是不安全的,因为它们被用作 围绕自由文本 URL 的分隔符; 引号(""")用于 在某些系统中,字符 "#"是不安全的,应该 总是被编码,因为它被用在万维网和其他 系统来从片段/锚标识符中分隔 URL,这些标识符可能 字符 "%"是不安全的,因为它用于 其他字符的编码。其他字符不安全是因为 已知网关和其他传输代理有时会修改 这些字符是 "{""}""|""\""^""~"、, "[""]",和 "`"

所有不安全字符必须始终编码在 URL 中 例如,字符 "#"必须在 URL 中编码,甚至在 通常不处理碎片或锚的系统 标识符,这样,如果 URL 被复制到另一个系统中, 如果不使用它们,则不需要更改 URL 编码。

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

为什么一定要加密呢? 请求看起来是这样的:

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

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

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

而不是

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

有没有人可以指向一个 RFC,说明一个带空格的 URL 必须进行编码?

URI,也就是 URL,是在 RFC3986中定义的。

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

URL 中可以有一个空格字符,并且在大多数浏览器中显示为% 20,但是浏览器编码规则经常变化,我们不能依赖于浏览器如何显示 URL。

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

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

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

祝你问话愉快。