【问题标题】:Is it valid HTTP to send a 406 with the client request has no Accept header使用客户端请求发送 406 是否有效 HTTP 没有 Accept 标头
【发布时间】:2018-08-01 10:34:51
【问题描述】:

https://www.rfc-editor.org/rfc/rfc7231#section-5.3.2 声明

没有任何 Accept 头字段的请求意味着用户代理 将接受任何媒体类型作为响应。

另外https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html 声明

如果不存在 Accept 头字段,则假定 客户端接受所有媒体类型。如果存在 Accept 标头字段, 如果服务器不能发送一个可以接受的响应 到组合的 Accept 字段值,然后服务器应该发送 406 (不可接受的)响应。

不过,在这种情况下发回 406 Not Acceptable 会是错误吗? 特别是我们希望强制客户编写可识别版本的客户端代码(我们的 Content-Types 已修改版本)。

【问题讨论】:

    标签: http


    【解决方案1】:

    在这种情况下发回406 Not Acceptable 会出错吗?

    简短的回答是,答案在您自己的问题中。一旦 RFC 2616 不再相关,请考虑引用 RFC 7231:

    没有任何Accept 标头字段的请求意味着用户代理将接受任何媒体类型作为响应。

    RFC 7231 的同一段规定在哪些情况下可以使用406 状态码:

    如果请求中存在标头字段,并且响应的所有可用表示都没有被列为可接受的媒体类型,则源服务器可以通过发送406(不可接受)来尊重标头字段响应或通过将响应视为不受内容协商的方式来忽略标头字段。

    查看406 状态码是如何定义的:

    6.5.6. 406 Not Acceptable

    406(不可接受)状态代码表明目标资源没有用户代理可以接受的当前表示,根据请求中收到的主动协商标头字段(第 5.3 节),并且服务器不愿意提供默认表示。

    【讨论】:

    • 但是无论如何,一个通用的 400 仍然可以发送?
    • @PaulPraet 这可能是最好的方法。
    【解决方案2】:

    是的,兼容的服务器是错误的。缺少的接受标头应被视为接受所有内容类型。这并不意味着您仍然不能拒绝缺少的接受标头,因为许多安全工具已经这样做了:

    如果您想保持合规性,可以发送400 error,这是通用的,但 406 错误会更有意义。

    【讨论】:

      猜你喜欢
      • 2013-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-30
      • 1970-01-01
      • 2015-04-26
      • 1970-01-01
      相关资源
      最近更新 更多