Chrome не отправляет " If-Modified-Since"
Я хочу, чтобы браузеры всегда добавляли (кроме первого раза) заголовок запроса "If-Modified-Since", чтобы избежать ненужного трафика.
заголовки ответов:
Accept-Ranges:bytes
Cache-Control:max-age=0, must-revalidate
Connection:Keep-Alive
Content-Length:2683
Content-Type:text/html; charset=UTF-8
Date:Thu, 05 Apr 2012 13:06:19 GMT
Keep-Alive:timeout=15, max=497
Last-Modified:Thu, 05 Apr 2012 13:05:11 GMT
Server:Apache/2.2.21 (Red Hat)
FF 11 и IE 9 оба отправляют "If-Modified-Since" и получают 304 в ответ, но Chrome 18 этого не делает и получает 200.
почему? Как заставить Chrome отправить заголовок" If-Modified-Since"? Я не знаю, важно это или нет, но все запросы проходят через HTTPS.
5 ответов
я гонялся за этой проблемой в течение некоторого времени, думал, что поделюсь тем, что нашел.
"правило на самом деле довольно простое: любая ошибка с сертификатом означает, что страница не будет кэшироваться."
https://code.google.com/p/chromium/issues/detail?id=110649
Если вы используете самозаверяющий сертификат, даже если вы скажете Chrome добавить исключение для него, чтобы страница загружалась, никакие ресурсы с этой страницы не будут кэшироваться и последующие запросы не будут иметь заголовок If-Modified-Since.
Я заметил почти такое же поведение и мои выводы:
прежде всего, индикатор состояния 200 в chrome-это не вся правда, вам также нужно посмотреть столбец "размер содержимого". Если это говорит "(из кэша)", ресурс был взят непосредственно из кэша, даже не спрашивая, был ли он изменен.
-
Это поведение кэширования ресурсов, которые не имеют каких-либо признаков истечения срока действия или максимального возраста, применяется при запросе статического файлы с последним измененным заголовком. Я заметил, что chrome (ver. 22):
- запрашивает файл в первый раз (очевидно, поскольку он не находится в кэше).
- спрашивает, изменяется ли он во второй раз (поскольку он находится в кэше, но не имеет признаков свежести).
- использует его непосредственно в третий раз, а затем (даже если это новый сеанс браузера).
Я немного озадачен таким поведением, но это довольно разумно, если это статичен, был изменен давным-давно и не изменился с момента последней проверки, вы можете предположить, что он будет действителен еще некоторое время (не знаю, как они его вычисляют).
я только что нашел этот вопрос, и после озадачивания Chrome If_Modified_Since
поведение, я нашел ответ.
решение Chrome кэшировать файлы основано на Expires
заголовок, который он получает. The Expires
заголовок имеет два основных требования:
- это должны быть в Гринвиче среднее время (GMT), и
- это должны форматироваться в соответствии с RFC 1123 (что в принципе RFC 822 с четырехзначным годом).
формат выглядит следующим образом:
Expires: Sat, 07 Sep 2013 05:21:03 GMT
например, в PHP следующий выводит правильно отформатированный заголовок.
$duration = time() + 3600 // Expires in one hour.
header("Expires: " . gmdate("D, d M Y H:i:s", $duration) . " GMT");
("GMT "добавляется к строке вместо флага часового пояса" e", потому что при использовании с gmdate()
, флаг выведет "UTC", который RFC 1123 считает недопустимым. Также обратите внимание, что константы PHP DateTime::RFC1123
и DATE_RFC1123
не будет обеспечить правильное форматирование, так как они выводят разница в GMT в часах [т. е. +02: 00] вместо "GMT".)
посмотреть спецификации формата даты/времени W3C для получения дополнительной информации.
короче, Chrome распознает заголовок, только если он соответствует этому точному формату. в сочетании с Cache-Control
заголовок...
header("Cache-Control: private, must-revalidate, max-age=" . $duration);
...позволил мне реализовать правильный контроль кэша. Как только Chrome распознал эти заголовки, он начал кэшировать страницы, которые я отправил (даже со строками запроса!), и он также начал отправлять
У меня была такая же проблема, в Chrome все запросы всегда были кодом состояния 200, в других браузерах 304.
оказалось, что у меня есть отключить кэш (в то время как DevTools открыт) зарегистрирован на странице Devtools-Settings-General..:)
- не отключайте кэш в инструментах Chrome Dev (на вкладке "Сеть").
- кэш-контроль должен быть
Cache-Control: public
. Использоватьtrue
в качестве второго параметраheader
функция PHP:header("Cache-Control: public", true);