在HTTP 202中使用Location头是否符合RFC标准?

时间:2014-10-05 03:03:34

标签: http http-headers http-status-codes rfc

我和我的同事讨论了在202 Accepted response中使用Location标题的一个很好的概念。

故事开始分析来自here的PHP header()函数的行为。有趣的摘录:

第二个特例是"位置:"头。它不仅将此标头发送回浏览器,而且还向浏览器返回REDIRECT(302)状态代码,除非已经设置了201或3xx状态代码。

他们在此默认行为中未包含202状态代码。看起来他们并不期望202响应有一个位置,确实:

header("HTTP/1.1 202");
header("Location: http://example.com");

将客户端重定向到位置网址。当然,可以使用header()函数的第三个参数来改变这种行为,但引起我注意的是:为什么他们明白默认情况下202不会持有Location头?

然后我查看RFC寻找202状态的官方含义。有趣的摘录:

使用此响应返回的实体应该包括请求的当前状态的指示,以及指向状态监视器的指针或用户可以期望满足请求的某种估计。

它没有明确地引用位置标题,就像之前(在相同的RFC文档中)201响应一样。这可能是PHP人员理解202响应不应该保持Location头的原因。指针会被解释为Location头还是PHP家伙做出了错误的假设?如果标准允许Location头有202响应:不应该像201响应定义更明确的官方文档吗?

最后,我查看了最多recently RFC版本,并在编辑中找到了一些变化:

通过此响应发送的表示应描述请求的当前状态,指向(或嵌入)状态监视器,为用户提供估计何时请求将被履行。

同样没有明确的假设指向表示位置标题。

简而言之,经过上述修订后:我是否使用带有202响应的Location标头符合RFC?

4 个答案:

答案 0 :(得分:22)

最后,我收到了R. Fielding的回复:

enter image description here

  

202是成功状态。 提到的指针只是响应正文中的超文本。   如果要使用“位置”将客户端重定向到其他资源,则应发送303。重定向请求的结果可以是202。

     

...罗伊

因此,不应在202 Accepted响应中使用Location标头。 PHP人员做了正确的解释。

编辑2017年3月:抱歉,我忘了在那一刻添加我们在同一个帖子中交换的其他邮件,所以我现在正在发布以备记录:

me: section 4.1 of the RFC 7240作者(J. Snell)在202 Accepted response中使用Location标头举例说明。他错了吗?这就像许多人从RFC 7231中理解这种行为。您能否向我发送有关这一有争议问题的任何参考资料?

Roy: 这个例子是在没有指示的情况下给出的,所以他没有错 因为他没有说出它意味着什么。位置可以在任何地方发送 信息。它的含义仅针对某些状态代码定义。

例如,如果他说过用户代理会使用 那个Location字段为用户提供状态指示器 他本来是错的。这可能是一个好主意,但它不是 标准的一部分。

PHP做出错误的假设,即Location仅用于201和 3xx响应,但允许这样做是因为它的内部API 不是HTTP;它将流转换为HTTP。

没有争议。为了成为标准的一部分,在 至少两个独立的实现必须显示相同 行为。在这种情况下,没有。

答案 1 :(得分:8)

来自RFC-2616:

  

使用此响应返回的实体应该包括请求当前状态的指示,以及指向状态监视器的指针或用户可以期望满足请求的估计值。

我认为这里的关键是“实体”,因为这里的问题是我们是否在响应头或响应主体中包含状态指示。几乎所有实体都被提及,它似乎意味着反应机构。例如:

  

10.5服务器错误5xx

     

以数字“5”开头的响应状态代码表示服务器知道它已经出错或无法执行请求的情况。除了在响应HEAD请求时,服务器应该包括一个实体,其中包含错误情况的解释,以及它是临时或永久条件。用户代理应该向用户显示任何包含的实体。这些响应代码适用于任何请求方法。

我没有看到浏览器曾向用户显示响应标头。对于303s:

  

10.3.4 303见其他

     

不同的URI应该由响应中的Location字段给出。除非请求方法是HEAD,否则响应的实体应该包含一个简短的超文本注释,其中包含指向新URI的超链接。

您不会在标题中收到超文本回复。

但是,section 7对实体所指的内容非常清楚:

  

实体由实体标题字段和实体主体组成,但有些响应只包含实体标题。

我认为在您的情况下,您所做的是符合RFC-2616标准。然而,实际上这一切都归结为客户端实现。收到202响应的客户端是否可以为Location:响应处理2xx标头?这应该是你如何应对的试金石,也是用于在标准化/文档化过程中推动标准的测试。

答案 2 :(得分:4)

实际上,根据rfc 7240 http://tools.ietf.org/html/rfc7240#section-4.1,您可以发送202状态代码和位置标头。 那将是一个异步响应,但显然,PHP不允许你这样做。

答案 3 :(得分:-1)

RFC承认这个概念含糊不清。这意味着规范目前没有说明“位置”如何与202一起使用,但另一方面,它不是图书馆只需更换状态代码的许可证。所以这绝对是一个PHP错误。