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

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

When I send a 304 response. How will the browser interpret other headers which I send together with the 304?

例如

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

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

Will this make sure the browser will not send another conditional GET request (nor any request) until $offset time has "run out"?

另外,其他标题呢?

我是否应该将这样的标头与 304 一起发送:

Should I send headers like this together with the 304:

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

我是否必须发送:

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

确保浏览器在下一次 $offset 用完"时发送有条件的 GET 请求,还是只是保存旧的 Last Modified 和 Etag 值?

To make sure the browser sends a conditional GET request the next time the $offset has "run out" or does it simply save the old Last Modified and Etag values?

在发送 304 响应标头时我还应该注意其他事项吗?

Are there other things I should be aware about when sending a 304 response header?

推荐答案

这篇博文为了驯服有条件获得"野兽,我帮了很多忙.

This blog post helped me a lot in order to tame the "conditional get" beast.

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

An interesting excerpt (which partially contradicts Ben's answer) states that:

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

If a normal response would have included an ETag header, that header must also be included in the 304 response.

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

Cache headers (Expires, Cache-Control, and/or Vary), if their values might differ from those sent in a previous response.

这完全符合 RFC2616 秒 10.3.5.

低于 200 个请求...

Below a 200 request...

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 对应物.

...And its optimal valid 304 counterpart.

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

请注意,Expires 标头最多为 Current Date + 一年,根据 RFC-2616 14.21.

Notice that the Expires header is at most Current Date + One Year as per RFC-2616 14.21.

相关文章