【问题标题】:How should an HTTP server respond to a proxy request it doesn't wish to handle?HTTP 服务器应该如何响应它不想处理的代理请求?
【发布时间】:2023-03-30 04:54:01
【问题描述】:

HTTP 请求的第一行包含一个“目标”,它是以下之一:

request-target = origin-form
               / absolute-form
               / authority-form
               / asterisk-form

origin-form 是典型的,例如GET /hello-world HTTP/1.1。代理请求使用absolute-form:

GET https://example.com/ HTTP/1.1

假设该请求到达一个原始服务器,它只是试图为某个其他域提供服务。 (例如,假设我们将上述请求发送到en.wikipedia.org。)手头的服务器不希望成为代理服务器,也不希望完成发出的请求。它应该返回什么? (理想情况下,为什么?HTTP RFC 中是否有任何地方说明了这一点?)

(我查询了几台服务器以查看经验上会发生什么。我得到了主要是 500、200(但内容错误)、409 Conflict 和在一个特殊情况下形成无限的301 Moved Permanently循环。觉得客户端向服务器发送代理请求是错误的,不能也不会实现它。服务器及其行为都没有错应该进行更改的区域完全取决于客户端,因此是 4xx,但我不清楚哪个是合适的。)

【问题讨论】:

    标签: http proxy


    【解决方案1】:

    好问题。来自RFC 2616

    5.1.2 请求-URI

    ...

    允许在未来的所有请求中转换到绝对URI HTTP 版本,所有 HTTP/1.1 服务器必须接受 absoluteURI 请求中的表单,即使 HTTP/1.1 客户端只会生成 他们在对代理的请求中。

    和:

    5.2 请求标识的资源

    Internet 请求所标识的确切资源由下式确定 检查 Request-URI 和 Host 标头字段。

    一个不允许资源不同的源服务器 请求的主机可以忽略主机头字段值,当 确定由 HTTP/1.1 请求标识的资源。 (但见 关于 HTTP/1.1 中主机支持的其他要求,请参见第 19.6.1.1 节。)

    根据主机区分资源的源服务器 请求(有时称为虚拟主机或虚主机 名称)必须使用以下规则来确定请求的 HTTP/1.1 请求上的资源:

    1. 如果 Request-URI 是绝对 URI,则主机是 请求-URI。请求中的任何主机头字段值必须是 忽略。

    2. 如果 Request-URI 不是绝对 URI,并且请求包括 一个Host头域,主机由Host头决定 字段值。

    3. 如果由规则 1 或 2 确定的主机不是 服务器,响应必须是 400(错误请求)错误消息。

    所以看起来正确的答案是要么忽略主机并尝试在本地完成请求,让它产生任何可能的错误,要么发送 400。这并不完全决定性,因为错误是在 GET 行中,而不是在 HOST 行中,并且您的不是“根据请求的主机区分资源的源服务器”,但它似乎与 RFC 一样接近。

    在后续的 RFC 中,RFC 7230 的措辞与上述 5.1.2 相同;它没有我能找到的第 5.2 节之类的内容,但它确实有:

    无效请求行的收件人应该以 400(错误请求)错误或 301(永久移动)重定向 请求目标正确编码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 2013-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多