什么时候应该在HTTP URL中编码星号?

时间:2014-08-01 17:56:07

标签: http url url-encoding rfc

根据RFC1738,星号(*)"可以在URL中使用未编码的":

  

因此,只有字母数字,特殊字符" $ -_。+!*'(),"和   可以使用用于其保留目的的保留字符   在URL中未编码。

然而,w3.org's Naming and Addressing material表示星号是"保留用于在特定方案中具有特殊意义"并暗示它应该被编码。

此外,根据RFC3986,URL是URI:

  

术语"统一资源定位器" (URL)指的是URI的子集   除了识别资源外,还提供了一种方法   通过描述其主要访问机制来定位资源   (例如,其网络"位置")。

它还指定星号是" sub-delim",它是"保留集"的一部分。和

  

生成URI的应用程序应对数据八位字节进行百分比编码   除非这些字符对应于保留集中的字符   URI方案特别允许表示其中的数据   成分

它还明确指定它更新RFC1738

我将所有这些都理解为要求将星号编码在URL中,除非它们用于URI方案定义的特殊用途。

RFC1738是否是HTTP URI方案的规范参考?它是否以某种方式免除星号编码,或者由于RFC3986而在这方面是否过时?

Wikipedia说"当没有保留目的时,角色不需要进行百分比编码。" RFC1738是否删除了星号的保留用途?

这个问题上似乎有各种资源和工具。

PHP' urlencoderawurlencode - 后者purports to follow RFC3986 - do encode the asterisk

然而,JavaScript的escapeencodeURIComponent do not encode the asterisk

和Java URLEncoder does not encode the asterisk

  

特殊字符"。"," - "," *"," _"保持不变。

热门online toolsa Google search for "online url encoder"的前两个结果)也不对星号进行编码。 URL Encode and Decode Tool明确规定,保留字符必须仅在某些情况下进行编码。"它继续列出星号和&符作为保留字符。它编码&符号,但不编码星号。

Stack Exchange社区中的其他类似问题似乎有陈旧,不完整或难以理解的答案:

考虑到所有这一点,当应该在HTTP网址中编码星号时?

1 个答案:

答案 0 :(得分:13)

简短回答

URL语法的当前定义表明您永远不需要对URL的路径,查询或片段组件中的星号字符进行百分比编码。


HTTP 1.1

正如@Riley Major所指出的那样,HTTP 1.1引用的URL语法的RFC已经被RFC3986废弃了,这与使用星号不像最初引用的RFC那样黑白。< / p>

RFC2396(2005年1月之前的URL规范 - 原始答案)

星号永远不需要在HTTP 1.1 URL中编码,因为*RFC2396中被列为“无保留字符”,用于在HTTP 1.1中定义URI语法。 path component of a URL中允许使用未保留的字符。

  

<强> 2.3。未保留的字符

     

URI中允许但没有保留目的的数据字符称为未保留。这些包括大写和小写字母,十进制数字以及一组有限的标点符号和符号。

   unreserved  = alphanum | mark

   mark        = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"
     

可以在不更改语义的情况下转义未保留的字符      的URI,但除非使用URI,否则不应该这样做      在不允许非转义字符出现的上下文中。

RFC3986(HTTP的当前URL语法)

RFC3986修改RFC2396以使星号成为保留字符,因为它“通常不安全解码”。我对此RFC的理解是,URL的路径,查询和片段组件中允许使用未编码的星号字符,因为这些组件未将星号指定为分隔符(2.2. Reserved Characters):

  

这些字符称为“保留”,因为它们可能(或可能不)通过通用语法定义为分隔符 ...如果URI组件的数据与保留字符的目的相冲突如果是分隔符,则在形成URI之前必须对冲突的数据进行百分比编码。

此外,3.3 Path确认保留字符的子集(sub-delims)可以在路径段中被解码(由/分解的路径组件的部分):

  

除了分层路径中的点段(“。”和“..”)之外,通用语法认为路径段是不透明的。 URI生成应用程序通常使用段中允许的保留字符。   ...   例如,分号(“;”)和等于(“=”)保留字符通常用于分隔适用于该段的参数和参数值。逗号(“,”)保留字符通常用于类似目的。例如,一个URI生成器可能使用诸如“name; v = 1.1”之类的段来指示对1.1版本的引用   “name”,而另一个可能使用诸如“name,1.1”之类的段来表示相同的内容。

HTTP 1.0

HTTP 1.0引用RFC1738来定义URL语法,通过一系列更新和废弃,它意味着它使用与HTTP 1.1相同的RFC作为URL语法。

就向后兼容性而言,RFC1738将星号指定为保留字符,但由于HTTP 1.0实际上没有为URL的路径组件中的未编码星号定义任何特殊含义,因此它不会破坏任何内容你用一个。这应该意味着你仍然可以安全地将星号放在指向最旧系统的URL中。


作为旁注,在两个HTTP规范中,星号字符在Request-URI中具有特殊含义,但不能用HTTP URL表示它:

  

星号“*”表示请求不适用于特定资源,而是适用于服务器本身,并且仅在使用的方法不一定适用于资源时才允许。一个例子是

   OPTIONS * HTTP/1.1

免责声明:我只是自己阅读和解释这些RFC,所以我可能错了。