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

Wil*_*lem 16 php get http-headers http-status-code-304

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

例如

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

这是否会确保浏览器不会发送另一个有条件的GET请求(也没有任何请求),直到$ offset时间"用完"?

另外,其他标题呢?

我应该像304一样发送这样的标题:

header('Content-Type: text/html');
Run Code Online (Sandbox Code Playgroud)

我必须发送:

header("Last-Modified:" . $modified);
header('Etag: ' . $etag);
Run Code Online (Sandbox Code Playgroud)

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

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

nul*_*ken 13

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

一个有趣的摘录(部分与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
Run Code Online (Sandbox Code Playgroud)

......和它的最佳有效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
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,HTTP 1.1中的"Expires"日期限制为"now + 1 year".因此,在这种情况下,2037不被视为有效.https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21«HTTP/1.1服务器不应该在未来发送超过一年的过期日期.» (2认同)

Ben*_*ank 6

Content-Type头只适用于包含身体反应.阿304响应并没有包含一个机构,以使头不适用.同样,您不希望发送Last-ModifiedETag因为304响应意味着文档未更改(因此也没有这两个标头的值).

举一个例子,看看安妮面包车Kesteren的这篇博客研究的WordPress " http_modified功能.需要注意的是它返回要么 Last-ModifiedETag 304响应.

  • 没有http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.5特别说如果原来有一个ETag,我们必须把它也包括在304中吗? (4认同)
  • If-None-Match 可以包含多个 ETag(这就是它被称为 if-NONE-match 的原因。浏览器或缓存代理可能缓存了文档的多个版本,因此它们从所有版本发送 ETag。如果您不这样做使用 ETag 进行响应,调用者将不知道要使用哪个版本。 (3认同)