我想将哪些标头与 304 响应一起发送?

当我发送 304 响应时。浏览器将如何解释我与 304 一起发送的其他标头?

例如:

header("HTTP/1.1 304 Not Modified");
header("Expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT");

这是否能确保浏览器在$offset时间“用完”之前不会发送另一个有条件的GET请求(或任何请求)?

另外,其他标头呢?

我应该像这样将标头与 304 一起发送吗:

header('Content-Type: text/html');

我必须发送:

header("Last-Modified:" . $modified);
header('Etag: ' . $etag);

为了确保浏览器在下次$offset“用完”时发送条件 GET 请求,还是只是保存旧的“上次修改时间”和“Etag”值?

发送 304 响应标头时是否还应注意其他事项?


答案 1

这篇博客文章帮助了我很多,以便驯服“有条件的获取”野兽。

一个有趣的摘录(部分与Ben的答案相矛盾)指出:

如果正常响应包含 ETag 标头,则该标头也必须包含在 304 响应中。

缓存标头(Expires、Cache-Control 和/或 Vary),如果它们的值可能与上一个响应中发送的值不同。

这完全符合 RFC 2616 sec 10.3.5


低于 200 请求...

HTTP/1.1 200 OK
Server: nginx/0.8.52
Date: Thu, 18 Nov 2010 16:04:38 GMT
Content-Type: image/png
Last-Modified: Thu, 15 Oct 2009 02:04:11 GMT
Expires: Thu, 31 Dec 2010 02:04:11 GMT
Cache-Control: max-age=315360000
Accept-Ranges: bytes
Content-Length: 6394
Via: 1.1 proxyIR.my.corporate.proxy.name:8080 (IronPort-WSA/6.3.3-015)
Connection: keep-alive
Proxy-Connection: keep-alive
X-Junk: xxxxxxxxxxxxxxxx

...并且其最优有效304对应物。

HTTP/1.1 304 Not Modified
Server: nginx/0.8.52
Date: Thu, 18 Nov 2010 16:10:35 GMT
Expires: Thu, 31 Dec 2011 16:10:35 GMT
Cache-Control: max-age=315360000
Via: 1.1 proxyIR.my.corporate.proxy.name:8080 (IronPort-WSA/6.3.3-015)
Connection: keep-alive
Proxy-Connection: keep-alive
X-Junk: xxxxxxxxxxx

请注意,标头最多符合 RFC-2616 14.21ExpiresCurrent Date + One Year


答案 2

标头仅适用于包含正文的响应。304 响应不包含正文,因此该标头不适用。同样,您不想发送,或者因为 304 响应意味着文档没有更改(因此这两个标头的值也没有更改)。Content-TypeLast-ModifiedETag

有关示例,请参阅Anne van Kesteren的这篇博客文章,该研究WordPress的功能。请注意,它返回和/ 304 响应。http_modifiedLast-ModifiedETag


推荐