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

时间:2009-03-27 20:16:59

标签: php http-headers get http-status-code-304

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

E.g。

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请求,或者只是保存旧的Last Modified和Etag值?

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

2 个答案:

答案 0 :(得分:13)

为了驯服“有条件的获得”野兽,这blog post帮助了我很多。

一个有趣的摘录(部分与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.21Expires标题最多为Current Date + One Year

答案 1 :(得分:6)

Content-Type标头仅适用于包含正文的回复。 304响应包含正文,因此标题不适用。同样,您不希望发送Last-ModifiedETag,因为304响应意味着文档未更改(因此也没有这两个标头的值)。

有关示例,请参阅this blog post by Anne van Kesteren检查WordPress'http_modified功能。请注意,它会返回 Last-ModifiedETag 304响应。