Del*_*lmo 19 http rfc http-status-codes http-headers
我与我的同事讨论了在202 Accepted响应中使用Location头的一个很好的概念.
故事从这里开始分析PHP header()函数的行为.有趣的摘录:
第二个特例是"Location:"标题.它不仅这个头发送回浏览器,但是除非201或3xx状态代码已经被设置也返回重定向(302)状态代码到浏览器.
它们未在此默认行为中包含202状态代码.看起来他们并不期望202响应有一个位置,事实上:
header("HTTP/1.1 202");
header("Location: http://example.com");
Run Code Online (Sandbox Code Playgroud)
将客户端重定向到位置URL.当然,也可以改变与header()函数的第三个参数,但一下就吸引了我的注意力被这种行为:为什么他们了解,默认202预计不会举行Location头?
然后我查看RFC,寻找202状态的官方含义.有趣的摘录:
返回此响应的实体应该包括请求的当前状态的指示,以及指向状态监视器的指针或用户可以期望满足请求的某些估计.
它没有明确地引用位置标头,就像之前(在相同的RFC文档中)201响应一样.这可能是PHP人员理解202响应不应该保持Location头的原因.指针会被解释为Location头还是PHP家伙做出了错误的假设?如果标准允许Location头有202响应:不应该像201响应定义更明确的官方文档?
最后,我回顾了最新的RFC版本,并发现编辑方面的一些变化:
与此响应发送表示应该描述请求的当前状态和(或嵌入)点状态监视器,一个当所述请求将被兑现的估计提供给用户.
同样,没有明确的假设指向 Location头.
简而言之,经过上述修订后:我是否使用带有202响应的Location标头符合RFC?
Del*_*lmo 24
最后,我收到了R. Fielding的回复:

202是成功状态.提到的指针只是响应体中的超文本.如果要使用"位置"将客户端重定向到其他资源,则应发送303.重定向请求的结果可以是202.
罗伊....
因此,不应使用Location标头作为202 Accepted响应.PHP人员做了正确的解释.
编辑2017年3月:对不起,我忘了在那一刻添加我们在同一个帖子中交换的其他消息,所以我现在发布以备记录:
me: 在RFC 7240的4.1节中,作者(J.Snell)在202 Accepted response中使用Location头给出了一个例子.他错了吗?就像许多人从RFC 7231中了解这种行为.您能否向我发送有关这一有争议问题的任何参考资料?
罗伊: 这个例子是在没有指示的情况下给出的,所以他并没有错,因为他没有说明这意味着什么.位置可以在任何消息中发送.它的含义仅适用于某些状态代码.
例如,如果他说用户代理会利用该位置字段向用户提供状态指示器,那么他就错了.这可能是一个好主意,但它不是标准的一部分.
PHP做出错误的假设,即Location仅用于201和3xx响应,但允许这样做,因为它的内部API不是HTTP; 它将流转换为HTTP.
没有争议.为了成为标准的一部分,至少两个独立的实现必须显示相同的行为.在这种情况下,没有.
来自RFC-2616:
返回此响应的实体应该包括请求的当前状态的指示,以及指向状态监视器的指针或用户可以期望满足请求的某些估计.
我认为这里的关键是"实体",因为这里的问题是我们是否在响应头或响应主体中包含状态指示.几乎所有实体都被提及,它似乎意味着反应机构.例如:
10.5服务器错误5xx
以数字"5"开头的响应状态代码表示服务器知道它已经错误或无法执行请求的情况.除了在响应HEAD请求时,服务器应该包括一个实体,其中包含错误情况的解释,以及它是临时或永久条件.用户代理应该向用户显示任何包含的实体.这些响应代码适用于任何请求方法.
我没有看到浏览器曾向用户显示响应标头.对于303s:
10.3.4 303见其他
不同的URI应该由响应中的Location字段给出.除非请求方法是HEAD,否则响应的实体应该包含一个带有指向新URI的超链接的短超文本注释.
你不会在标题中得到超文本响应.
但是,第7节非常明确该实体所指的内容:
实体由实体标头字段和实体主体组成,但有些响应仅包含实体标头.
我认为在您的情况下,您所做的是符合RFC-2616标准.然而,实际上这一切都归结为客户端实现.收到202响应的客户端是否可以处理响应的Location:标头2xx?这应该是您对如何响应的试金石,也是用于在标准化/文档化过程中推动标准的测试.
小智 5
实际上,按照rfc 7240 http://tools.ietf.org/html/rfc7240#section-4.1,您可以发送202状态代码以及Location标头。那将是在异步响应中,但是,显然,PHP不允许您这样做。
| 归档时间: |
|
| 查看次数: |
4344 次 |
| 最近记录: |