Какие заголовки я хочу отправить вместе с ответом 304?
Когда я отправляю ответ 304. Как браузер интерпретирует другие заголовки, которые я отправляю вместе с 304?
например.
header("HTTP/1.1 304 Not Modified");
header("Expires: " . gmdate("D, d M Y H: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?
Ответы
Ответ 1
Это сообщение в блоге помогло мне много, чтобы приручить зверя "условного получить".
Интересный отрывок (частично противоречащий ответу Бена) гласит, что:
Если обычный ответ включал заголовок 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.
Ответ 2
Заголовок Content-Type
применяется только к ответам, которые содержат тело. Ответ 304 не содержит тела, поэтому заголовок не применяется. Аналогично, вы не хотите отправлять Last-Modified
или ETag
, потому что ответ 304 означает, что документ не изменился (и поэтому не имеет значений этих двух заголовков).
В качестве примера см. это сообщение в блоге Анны ван Кестерен изучение WordPress 'http_modified
. Обратите внимание, что он возвращает либо Last-Modified
, и ETag
, либо ответ 304.