Какие заголовки я хочу отправить вместе с ответом 304?

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

Например

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

Убедится ли это, что браузер не отправит еще один условный запрос GET (или любой запрос) до тех пор, пока не истечет время смещения?

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

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

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

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

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

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

Есть ли другие вещи, о которых мне следует знать при отправке заголовка ответа 304?

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

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

Если бы обычный ответ включал заголовок 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 .

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

Например, см. Это сообщение в блоге Энн ван Кестерен , http_modified функцию http_modified WordPress . Обратите внимание, что он возвращает либо Last-Modified и ETag либо ответ 304.