【问题标题】:In HTTP, is a query allowed when only giving a path as Request-URI?在 HTTP 中,仅将路径作为 Request-URI 时是否允许查询?
【发布时间】:2017-07-20 11:57:22
【问题描述】:

我在实现一个简单的 Web 服务器时遇到了问题。根据规范,HTTP/1.1 request 以这一行开头:

Request-Line   = Method SP Request-URI SP HTTP-Version CRLF

在这一行中,有一个Request-URI,其定义如下:

Request-URI    = "*" | absoluteURI | abs_path | authority

因此,我可以发送完整的 URI(带有架构、服务器名称等)或 abs_pathauthority,如规范中所定义,仅适用于 CONNECT 方法)。然后我有:

abs_path      = "/"  path_segments
path_segments = segment *( "/" segment )

这些定义来自URI spec,它链接在 HTTP 规范中。正如我们所见,abs_path 只是一个绝对路径没有查询。

到目前为止的理论。现在,当我实际向http://example.com/?key=value 发送 HTTP GET 请求时,会发送此行:

GET /?key=value HTTP/1.1

我使用 Firefox、Chrome 和 curl 进行了尝试。根据规范,这不应该是非法的吗?我在监督什么吗?

【问题讨论】:

    标签: http curl httprequest uri


    【解决方案1】:

    您的问题是您正在查看规范的过时版本。

    有关正确的 ABNF,请参阅 https://www.greenbytes.de/tech/webdav/rfc7230.html#origin-form

    【讨论】:

    • 谢谢。由于我不知道 greenbytes 是谁或什么,所以我检查了IETF version of that RFC,它说的是一样的。
    【解决方案2】:

    这是 RFC 2616 中的一个已知错误:

    RFC 7230 已淘汰 RFC 2616,它允许这样做。它对request-line 的定义使用request-target(而不是Request-URI),它允许origin-form(而不是abs_path):

    origin-form    = absolute-path [ "?" query ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-31
      • 2016-05-01
      • 2012-02-28
      • 2019-02-23
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多