Какие заголовки я хочу отправить вместе с ответом 304? - PullRequest
16 голосов
/ 27 марта 2009

Когда я отправляю ответ 304. Как браузер будет интерпретировать другие заголовки, которые я отправляю вместе с 304?

* 1003 Е.Г. *

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

Будет ли это гарантировать, что браузер не отправит еще один условный запрос GET (или какой-либо другой запрос), пока не истечет время $ offset?

А как насчет других заголовков?

Должен ли я отправлять такие заголовки вместе с 304:

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

Должен ли я отправить:

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

Чтобы убедиться, что браузер отправляет условный запрос GET в следующий раз, когда $ offset "закончится", или он просто сохраняет старые значения Last Modified и Etag?

Есть ли что-то, о чем я должен знать при отправке заголовка ответа 304?

Ответы [ 2 ]

13 голосов
/ 19 ноября 2010

Это сообщение в блоге мне очень помогло приручить зверя "условного получения".

Интересный отрывок (который частично противоречит ответу Бена) гласит:

Если обычный ответ включал бы заголовок ETag, этот заголовок также должен быть включен в ответ 304.

Заголовки кэша (Expires, Cache-Control и / или Vary), если их значения могут отличаться от значений, отправленных в предыдущем ответе.

Это в полном соответствии с RFC 2616 сек. 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

Обратите внимание, что заголовок Expires не более Current Date + One Year согласно RFC-2616 14.21 .

6 голосов
/ 27 марта 2009

Заголовок Content-Type применяется только к ответам, которые содержат тело. Ответ 304 не содержит тело, поэтому заголовок не применяется. Точно так же вы не хотите отправлять Last-Modified или ETag, потому что ответ 304 означает, что документ не изменился (и поэтому значения этих двух заголовков также отсутствуют).

Например, см. эту запись в блоге Анны ван Кестерен , исследующую WordPress 'http_modified Обратите внимание, что он возвращает либо Last-Modified и ETag или ответ 304.

...