【问题标题】:When can you have relative URLs on the request line of GET http requests?什么时候可以在 GET http 请求的请求行上有相对 URL?
【发布时间】:2018-10-03 20:54:29
【问题描述】:

我尝试了以下请求:

GET index.htm HTTP/1.1
connection: close
host: example.com
content-length: 0

但获得了 400 错误请求。为什么?服务器应该能够拼凑绝对 URL:http://example.com/index.htm。它为什么抱怨?我是否需要引用标头才能在请求行上使用相对 URL?

【问题讨论】:

    标签: http url request


    【解决方案1】:

    简答

    您不能使用相对路径,因为 HTTP 规范 (RFC7230) 要求使用绝对路径。

    说明

    如果您只是参考 HTTP 规范,很容易找出为什么您的请求得到 400 Bad Request 响应:它违反了规范。 RFC7230 定义在您的场景中,请求目标必须使用需要绝对路径的所谓 origin-form:

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

    例如,http://example.org/where?q=now 的 HTTP 请求将是:

    GET /where?q=now HTTP/1.1
    Host: example.org
    

    如果路径为空,例如http://example.org,HTTP 请求将是:

    GET / HTTP/1.1
    Host: example.org
    

    这是因为需要绝对路径,如Section 5.3.1 中所述(强调我的):

    直接向源服务器发出请求时,而不是 CONNECT 或服务器范围的 OPTIONS 请求(如下所述),客户端 必须仅发送目标的绝对路径和查询组件 URI 作为请求目标。

    【讨论】:

    • 您显然忘记阅读问题了。并且懒得看下面我的解决方案。我不能对你投反对票,但这没有帮助。
    • 这实际上是正确的。您必须区分绝对路径和绝对 URL。这个答案只是比“路径必须以/开头”更高级和抽象。
    【解决方案2】:

    我认为GET index.htm HTTP/1.1 这一行缺少index.html 上的“l”。

    希望有帮助!

    【讨论】:

    • 感谢您帮助我,但恐怕您弄错了。不存在的文件不会导致 400 Bad Request 响应。更重要的是,我知道该文件按原样存在。
    【解决方案3】:

    我找到了答案:如果请求行上的 URL 不是绝对的,则它必须是绝对路径。这意味着您可以省略协议和主机名,但不能省略路径的任何部分。以下工作:

    GET /index.htm HTTP/1.1
    connection: close
    host: example.com
    content-length: 0
    

    【讨论】:

    • 这不是您问题的答案,因为您的 HTTP 请求中不再有相对路径——您已在上面的示例请求中将其设为绝对路径。 Rei给出了正确的答案,就是不能在HTTP请求的请求行中使用相对路径。
    猜你喜欢
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 2019-06-08
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多