【问题标题】:Can any path segments of a URI have a query component?URI 的任何路径段都可以有查询组件吗?
【发布时间】:2011-09-20 15:08:37
【问题描述】:

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

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

但是,我从未在除最后一个段之外的任何段中看到带有查询参数的 URL。所以,我不确定我是否正确阅读。

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

【问题讨论】:

    标签: url syntax uri rfc rfc2396


    【解决方案1】:

    RFC 所指的是这样的:

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

    这可以被解释为/foo/bar/baz.html 参数param=valuebar 段的路径。不使用问号。

    请注意,RFC 2396 已被 RFC 3986 废弃,它省略了特定于段的参数的规范,有利于一般注意,即实现可以(并且做)不同的事情来嵌入特定于段的参数:

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

    【讨论】:

    • 我不知道该规范已过时。我现在要查看更新的。
    • 附录 D2“修改”也特别有帮助......非常感谢,我永远不会通过阅读过时的规范来解决这个问题
    • 如果使用了问号,那么它就变成了查询?
    【解决方案2】:

    当你看下面的语法时,它是这样写的:

      path          = [ abs_path | opaque_part ]
    
      path_segments = segment *( "/" segment )
      segment       = *pchar *( ";" param )
      param         = *pchar
    
      pchar         = unreserved | escaped |
                      ":" | "@" | "&" | "=" | "+" | "$" | ","
    

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

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

    【讨论】:

      【解决方案3】:

      根据我对 RFC 2396 的阅读,? 是保留字符,仅用于分隔查询段。 ? 不允许在路径或查询段中。

      在您的示例中,第一个 ? 标记查询段的开始。第二个? 在查询段内,是不允许的。

      【讨论】:

        【解决方案4】:

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

        如果你想要这样的参数,你总是可以使用 # 符号(就像现在很多基于 javascript 的 GUI 一样)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-02-18
          • 2019-07-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多