在许多网站(特别是 gmail、yahoo 或 hotmail)中,您会注意到 URL
紧随其后的是:yahoo.com/abc/bcd.html;_x=12323;_y=2322;
这些 _x 和 _y 参数是什么?如何在服务器端代码中访问它们?
在许多网站(特别是 gmail、yahoo 或 hotmail)中,您会注意到 URL
紧随其后的是:yahoo.com/abc/bcd.html;_x=12323;_y=2322;
这些 _x 和 _y 参数是什么?如何在服务器端代码中访问它们?
它们是URL 中的参数(与查询字符串不同),本文有一个很好的讨论,包括这个有用的图表:
<scheme>://<username>:<password>@<host>:<port>/<path>;<parameters>?<query>#<fragment>
请注意,它们不是 Java EEServletRequest#getParameter
等中使用的“参数”(当他们说“参数”时,它们的意思是查询字符串或 POST 参数,它们是不同的)。
这在RFC 2396 的 §3.3 中定义:
路径可能由一系列路径段组成,由单个斜杠“/”字符分隔。在路径段中,字符“/”、“;”、“=”和“?” 被保留。每个路径段可以包括一系列参数,用分号“;”表示 特点。这些参数对于解析相对引用并不重要。
(为免生疑问:上面的“路径”一词不包括查询字符串,请参见第 3 节的开头。)
但是, RFC 2396 已被RFC 3986淘汰,它对上述内容进行了明显的修改:
除了层次路径中的点段之外,路径段被通用语法认为是不透明的。生成 URI 的应用程序通常使用段中允许的保留字符来分隔特定于方案或特定于解引用处理程序的子组件。例如,分号 (";") 和等号 ("=") 保留字符通常用于分隔适用于该段的参数和参数值。逗号 (",") 保留字符通常用于类似目的。例如,一个 URI 生产者可能使用诸如“name;v=1.1”之类的段来指示对“name”的 1.1 版本的引用,而另一个 URI 生产者可能使用诸如“name,1.1”之类的段来指示相同。参数类型可以由特定于方案的语义定义,
它们只是可能出现在 URL 中的字符。您可以通过解析 URL 来访问它们,因为它们不是常规的查询字符串参数。
URI 语法在RFC 3986中定义如下:
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] hier-part = "//" authority path-abempty / path-absolute / path-rootless / path-empty
[...]
The following are two example URIs and their component parts: foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragment | _____________________|__ / \ / \ urn:example:animal:ferret:nose
在此示例 ( http://yahoo.com/abc/bcd.html;_x=12323;_y=2322;
) 中,这些参数是路径组件的一部分。本质上,这只是该应用程序中用于识别资源的约定。
一般而言,尽管 HTTP URI 中的路径通常与您在文件系统上找到的路径相似,但它们不必以任何方式与文件系统结构相关。这纯粹是来自取消引用 URI 的引擎的实现决策(即 HTTP 服务器实现以及将请求分派给任何将产生响应的对象)。
严格来说,查询也是 URI 的一个组成部分(你会发现很多关于“RESTful”URI 的讨论都是毫无意义的,除了一些 SEO 技术)。
因为在使用 HTML 表单时参数是通过查询段传递的,所以许多 HTTP 框架通过将查询拆分为地图来公开其内容。例如,在 Java/Servlet 内容中,查询字符串 ( getQueryString()
) 会自动填充由getParameter(...
) 返回的参数。
如果要从中获取参数bcd.html;_x=12323;_y=2322;
,则必须自己拆分路径。
这些是URI路径部分中段的参数。