Какие заголовки я хочу отправить вместе с ответом 304?
-
22-08-2019 - |
Вопрос
Когда я отправляю ответ 304.Как браузер будет интерпретировать другие заголовки, которые я отправляю вместе с 304?
Например.
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?
Решение
Этот Сообщение блога мне очень помогло приручить зверя "условного получения".
Интересный отрывок (который частично противоречит ответу Бена) гласит:
Если обычный ответ включал бы заголовок 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 означает, что документ не изменился (и поэтому не изменились значения этих двух заголовков).
Для примера см. это сообщение в блоге Анны ван Кестерен изучение WordPress' http_modified
функция.Обратите внимание, что он возвращает или Last-Modified
и ETag
или 304 ответ.