URI的任何路径段都可以有查询组件吗?

时间:2011-06-22 18:11:30

标签: url syntax uri rfc rfc2396

根据Section 3.3, Path Component of RFC2396 - Uniform Resource Identifiers

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

但是,我从未在最终版本以外的任何细分中看到过带有查询参数的网址。所以,我不确定我是否正确阅读。

http://www.url.com/segment1?seg1param1=val1/page.html?pageparam1=val2是否为有效网址?

4 个答案:

答案 0 :(得分:10)

RFC所指的是这样的:

http://www.example.com/foo/bar;param=value/baz.html

可以将其解释为/foo/bar/baz.html的路径param=valuebar段。没有使用问号。

请注意,{23}已废弃RFC 2396,它省略了特定于段的参数的规范,而忽略了一般说明,即实现可以(并且确实)执行不同的操作来嵌入特定于段的参数:

  

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

答案 1 :(得分:1)

当您查看下面的语法时,会写出:

  path          = [ abs_path | opaque_part ]

  path_segments = segment *( "/" segment )
  segment       = *pchar *( ";" param )
  param         = *pchar

  pchar         = unreserved | escaped |
                  ":" | "@" | "&" | "=" | "+" | "$" | ","

一个段由pchar和param组成,param本身就是一个pchar。 当我们继续阅读时,绝对没有“?” pchar字符组件中的字符。所以参数不能有任何“?”,并且不能有“?”分段。

所以我同意Edward Thomson的回答,他说“?”只划分查询段,不能在路径中使用。

答案 2 :(得分:0)

根据我对RFC 2396的解读,没有?是保留字符,仅用于分隔查询段。

在您的示例中,第一个?标记了查询段的开头。第二个?位于查询细分中,不允许使用。

答案 3 :(得分:0)

我相信你可以做到这一点,大多数网络服务器都会处理它,但我不相信你会得到你期望的结果。那就是pageparam1 = val2不会评估。

如果你想要这样的参数,你可以随时使用#符号(现在很多基于javascript的GUI都可以)。