你能在分块的HTTP响应尾部设置Location头吗?

3
HTTP 1.1响应可以分块传输(规范)。在最后一个分块结束时,服务器可以发送包含其他标头的“拖车”。

问题是:您能够在拖车中包含Location标头,并且浏览器会通过重定向做出反应吗?
2个回答

2

正如我所猜测的那样。让我们看看是否有其他人有不同的经验。 - Bozho
我不明白为什么它在3xx中不能工作。你能详细说明一下吗? - Julian Reschke
@Julian Reschke - 他的意思是如果响应状态最初不为3xx,则位置标头将无法工作。因此,如果我发送200,然后将Location标头作为尾部 - 它将无法工作。 - Bozho

1

是的。

要有Location头,服务器应该响应201或3XX状态码之一。它还应该包含内容,可能是HTML中解释发生了什么并提供一个方便的超链接到资源的消息。内容需要被分块,Transfer-Encoding头应该存在并具有值“chunked”。

如果所有这些都是真实的,那么Trailer头可以添加一个值为“Location”,然后Location头可以跟随内容。

这是真正的问题:这似乎很愚蠢和无意义。你可能会有什么用例,其中你将客户端重定向到新位置,但直到内容完成后你才知道该位置?我想不出一个理由。但也许你有一个?如果没有一个好的用例,那么我认为你不应该这样做。

编辑:我想到了一个原因。Shiflett举了一个分块传输编码的例子,其中发送给客户端的第一块HTML说:“我们正在完成您的交易。”在完成交易时经过了一段时间。然后向客户端发送第二个和最后一个HTML块,其中说:“好的,您的交易现在已经完成。”(HTTP Dev's Handbook p97)将这个想法与创建新文件的201结合起来。可能直到服务器处理的最后才知道新文件的位置。因此,它希望使用分块传输编码,并希望将Location头放在trailers中。

第二次编辑:是的,您可以添加它,因为规范明确禁止以下标头字段:Transfer-Encoding、Content-Length和Trailer。


嗯,真正的问题是大多数(全部?)浏览器都没有实现尾部。 - Julian Reschke
好的。但是这可以被非浏览器客户端处理。虽然我仍然不知道你为什么想要这样做... - james.garriss
在IE 9、FF 9、Chrome 16和Safari 5(在Win 7上)上运行了这些测试(http://www.browserscope.org/network/test)。它断言没有一种浏览器支持拖车(trailers)。有人知道原因吗? - james.garriss
1
可能是个先有鸡还是先有蛋的问题。没有网站使用它。 - Julian Reschke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接