根据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' urlencode
和rawurlencode
- 后者purports to follow RFC3986 - do encode the asterisk。
然而,JavaScript的escape
和encodeURIComponent
do not encode the asterisk。
和Java URLEncoder
does not encode the asterisk:
特殊字符"。"," - "," *"," _"保持不变。
热门online tools(a Google search for "online url encoder"的前两个结果)也不对星号进行编码。 URL Encode and Decode Tool明确规定,保留字符必须仅在某些情况下进行编码。"它继续列出星号和&符作为保留字符。它编码&符号,但不编码星号。
Stack Exchange社区中的其他类似问题似乎有陈旧,不完整或难以理解的答案:
encodeQueryParam
purports to follow RFC3986,但它没有编码星号。截至2014-08-01 12:50 PM CDT,该问题没有答案。考虑到所有这一点,当应该在HTTP网址中编码星号时?
答案 0 :(得分:13)
URL语法的当前定义表明您永远不需要对URL的路径,查询或片段组件中的星号字符进行百分比编码。
正如@Riley Major所指出的那样,HTTP 1.1引用的URL语法的RFC已经被RFC3986废弃了,这与使用星号不像最初引用的RFC那样黑白。< / p>
星号永远不需要在HTTP 1.1 URL中编码,因为*
在RFC2396中被列为“无保留字符”,用于在HTTP 1.1中定义URI语法。 path component of a URL中允许使用未保留的字符。
<强> 2.3。未保留的字符
URI中允许但没有保留目的的数据字符称为未保留。这些包括大写和小写字母,十进制数字以及一组有限的标点符号和符号。
unreserved = alphanum | mark mark = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"
可以在不更改语义的情况下转义未保留的字符 的URI,但除非使用URI,否则不应该这样做 在不允许非转义字符出现的上下文中。
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引用RFC1738来定义URL语法,通过一系列更新和废弃,它意味着它使用与HTTP 1.1相同的RFC作为URL语法。
就向后兼容性而言,RFC1738将星号指定为保留字符,但由于HTTP 1.0实际上没有为URL的路径组件中的未编码星号定义任何特殊含义,因此它不会破坏任何内容你用一个。这应该意味着你仍然可以安全地将星号放在指向最旧系统的URL中。
作为旁注,在两个HTTP规范中,星号字符在Request-URI中具有特殊含义,但不能用HTTP URL表示它:
星号“*”表示请求不适用于特定资源,而是适用于服务器本身,并且仅在使用的方法不一定适用于资源时才允许。一个例子是
OPTIONS * HTTP/1.1
免责声明:我只是自己阅读和解释这些RFC,所以我可能错了。