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):

    1. запрашивает файл в первый раз (очевидно, поскольку он не находится в кэше).
    2. спрашивает, изменяется ли он во второй раз (поскольку он находится в кэше, но не имеет признаков свежести).
    3. использует его непосредственно в третий раз, а затем (даже если это новый сеанс браузера).
  • Я немного озадачен таким поведением, но это довольно разумно, если это статичен, был изменен давным-давно и не изменился с момента последней проверки, вы можете предположить, что он будет действителен еще некоторое время (не знаю, как они его вычисляют).


я только что нашел этот вопрос, и после озадачивания Chrome If_Modified_Since поведение, я нашел ответ.

решение Chrome кэшировать файлы основано на Expires заголовок, который он получает. The Expires заголовок имеет два основных требования:

  1. это должны быть в Гринвиче среднее время (GMT), и
  2. это должны форматироваться в соответствии с 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..:)


  1. не отключайте кэш в инструментах Chrome Dev (на вкладке "Сеть").
  2. кэш-контроль должен быть Cache-Control: public. Использовать true в качестве второго параметра header функция PHP: header("Cache-Control: public", true);