故事从here开始分析PHP header()函数的行为.有趣的摘录:
第二个特殊情况是“位置:”标题.它不仅将此标题发回浏览器,而且还会向浏览器返回REDIRECT(302)状态码,除非已设置了201或3xx状态码.
它们在此默认行为中未包含202状态代码.似乎他们不希望202回应有一个位置,确实:
header("HTTP/1.1 202"); header("Location: http://example.com");
将客户端重定向到位置URL.当然,可以用header()函数的第三个参数来改变这个行为,但是引起我注意的是:为什么他们明白,默认情况下,202不会保留一个Location头?
然后我查看了RFC的官方含义202的状态.有趣的摘录:
该响应返回的实体应该包括请求的当前状态的指示,以及指向状态监视器的指针,或者用户何时可以期望请求被满足的估计.
它没有明确地引用位置标题,就像前面(在相同的RFC文档)201响应中一样.这可能是为什么PHP家伙了解202响应不应该保持位置标题的原因.一个指针会被解释为位置头还是PHP家伙做错了假设?如果标准允许位置标题与202响应:应该不是官方文档更明确的像201响应定义?
最后我审查了最多的recently RFC版本,并在编辑中找到一点变化:
与此响应发送的表示应描述请求的当前状态,并指向(或嵌入)状态监视器,该状态监视器向用户提供何时将满足请求的估计.
再次,它不够明确地假定该点意味着位置标题.
简而言之,经过以上修订:我是RFC符合使用位置标题与202响应?
非常感谢你的时间.
202 is a success status. The pointer mentioned is just hypertext in the body of the response.
A 303 should be sent if you want to use Location to redirect the client to another resource. The result of the redirected request can be a 202.….Roy
因此,在202 Accepted响应中不应使用Location头. PHP家伙做了正确的解释.
编辑2017年3月:对不起,我忘了添加在同一个线程中交换的其他消息,所以我现在发布记录:
我:在section 4.1 of the RFC 7240作者(J. Snell)给出了一个使用位置标题在202接受响应的例子.他错了吗就像许多人从RFC 7231中了解这个行为一样.你可以向我发送有关这个有争议的问题的任何参考?
罗伊:这个例子没有指示,所以他没有错
因为他不说什么意思位置可以任意发送
信息.这仅仅是为某些状态代码定义.
例如,如果他说用户代理会使用它
该位置字段为用户提供状态指示符,然后
他会错的这可能是一个好主意,但不是
标准的一部分.
PHP假定位置仅在201和
3xx响应,但它是允许的,因为它的内部API
不是HTTP;它会将流转换为HTTP.
没有争议为了成为标准的一部分,在最少两个独立的实现必须显示相同行为.在这种情况下,没有.