HTTP请求:';'请求URL中的字符

时间:2012-07-23 11:21:01

标签: java .net http http-headers

在许多网站(特别是gmail,yahoo或hotmail)中,您会注意到网址

之类的是:yahoo.com/abc/bcd.html; _x = 12323; _y = 2322;

这些_x和_y参数是什么?如何在服务器端代码中访问它们?

4 个答案:

答案 0 :(得分:4)

它们是URL中的参数(与查询字符串不同),this article有一个很好的讨论,包括这个有用的图表:

<scheme>://<username>:<password>@<host>:<port>/<path>;<parameters>?<query>#<fragment>

请注意,它们不是Java EE ServletRequest#getParameter中使用的意义上的“参数”(当他们说“参数”时它们意味着查询字符串或POST参数,它们是不同的)。

这在§3.3 of RFC 2396

中定义
  

路径可以由一系列由a分隔的路径段组成   单斜杠“/”字符。在路径段内,字符   “/”,“;”,“=”和“?”保留。每个路径段可以包括a   参数序列,由分号“;”表示字符。   这些参数对于解析相对而言并不重要   引用。

(为避免疑义:上面的“路径”一词不包括查询字符串,请参阅beginning of §3。)

RFC 2396已被RFC 3986淘汰,amends the above显着:

  

除了分层路径中的点段之外,路径段也是如此   通用语法认为不透明。 URI生成应用程序   经常使用段中允许的保留字符来分隔   特定于方案或特定于引用程序处理程序的子组件。对于   例如,分号(“;”)和等于(“=”)保留字符是   通常用于分隔适用的参数和参数值   那个部分。逗号(“,”)保留字符通常用于   类似的目的。例如,一个URI生成器可能使用一个段   例如“name; v = 1.1”表示对1.1版本的引用   “name”,而另一个可能使用诸如“name,1.1”之类的段   表示相同。参数类型可以由特定于方案定义   语义,但在大多数情况下,参数的语法是特定的   URI的解除引用算法的实现。

答案 1 :(得分:2)

他们只是可能出现在网址中的字符。您可以通过解析URL来访问它们,因为它们不是常规的查询字符串参数。

答案 2 :(得分:1)

这些是URI的路径部分中的段的参数。

答案 3 :(得分:1)

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;)中,这些参数是path component的一部分。从本质上讲,这只是该应用程序中使用的一种约定,它能够识别资源。

一般来说,虽然HTTP URI中的路径通常与您在文件系统中找到的路径类似,但它们不必以任何方式与文件系统结构相关。这纯粹是来自引擎的实现决策,它取消引用URI(即HTTP服务器实现以及将请求分派给将产生响应的任何内容)。

严格来说,查询也是URI的一个组成部分(你会发现很多关于“RESTful”URI的讨论都是没有意义的,除了一些SEO技术)。

因为在使用HTML表单时通过查询段传递参数,所以许多HTTP框架通过将查询拆分为映射来公开其内容。例如,在Java / Servlet内容中,查询字符串(getQueryString())会自动填充getParameter(...)返回的参数。

如果您想从bcd.html;_x=12323;_y=2322;获取参数,则必须自行拆分路径。