问题描述

允许 URI(特别是 HTTP URL) 包含一个或多个空格字符?如果一个 URL 必须编码,+只是一个常见的惯例,还是一个合法的选择?

特别地,有人可以指向一个 RFC,该 RFC 指示具有空格的 URL 必须被编码?

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

最佳解决方案

根据 RFC 1738

Unsafe:

Characters can be unsafe for a number of reasons. The space character is unsafe because significant spaces may disappear and insignificant spaces may be introduced when URLs are transcribed or typeset or subjected to the treatment of word-processing programs. The characters "<" and ">" are unsafe because they are used as the delimiters around URLs in free text; the quote mark (""") is used to delimit URLs in some systems. The character "#" is unsafe and should always be encoded because it is used in World Wide Web and in other systems to delimit a URL from a fragment/anchor identifier that might follow it. The character "%" is unsafe because it is used for encodings of other characters. Other characters are unsafe because gateways and other transport agents are known to sometimes modify such characters. These characters are "{", "}", "|", "", "^", "~", "[", "]", and "`".

All unsafe characters must always be encoded within a URL. For example, the character "#" must be encoded within URLs even in systems that do not normally deal with fragment or anchor identifiers, so that if the URL is copied into another system that does use them, it will not be necessary to change the URL encoding.

次佳解决方案

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

GET /url HTTP/1.1
(Ignoring headers)

有三个字段由一个空白区隔开。如果你在你的网址上放一个空格:

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 在 RFC 3986 中定义,但其他 RFC 也是相关的,但 RFC 1738 已过时。

他们可能没有空格,还有许多其他字符。由于这些禁止的字符通常需要以某种方式进行表示,所以通过将它们转换为具有”%” 前缀的 ASCII 十六进制等价物,可以将它们编码成 URL 。

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

第五种方案

是的,空间通常编码为”%20″ 。出于安全原因,传递给 URL 的任何参数都应进行编码。

第六种方案

Can someone point to an RFC indicating that a URL with a space must be encoded?

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

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

第七种方案

这是一个很棒的页面,它显示了使用多种不同技术编写的东西。

http://andrewu.co.uk/tools/uriencoder/

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

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

第八种方案

URL 可以在其中具有空格,并且它们将在大多数浏览器中显示为%20,但是浏览器编码规则变化很大,我们不能依赖于浏览器如何显示 URL 。

因此,您可以用 URL 中的空格字符替换您认为 URL 的任何字符更易于阅读和 「漂亮」;)….. 所以一般首选的字符是”-“,”_”,”+” …. 但是这些都是不要强迫,所以你可以使用任何不应该在 URL 中的字符已经。

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

您可以看到 Stak 溢出本身使用’-‘ 字符作为空格 (%20) 替换。

有一个快乐的问题。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛