Браузер Chrome не отправляет заголовок if-Modified-Since на сервер. - PullRequest
40 голосов
/ 28 ноября 2011

У меня есть эти заголовки, отправляемые клиенту сервером:

Cache-Control:private
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html
Date:Sun, 27 Nov 2011 11:10:38 GMT
ETag:"12341234"
Set-Cookie:connect.sid=e1u...7o; path=/; expires=Sun, 27 Nov 2011 11:40:38 GMT; httpOnly
Transfer-Encoding:chunked
last-modified:Sat, 26 Nov 2011 21:42:45 GMT

Я хочу, чтобы клиент подтвердил, что файл не изменился на сервере, и отправил "200", если в противном случае он имеет значение "304".

Firefox отправляет:

if-modified-since: Sat, 26 Nov 2011 21:42:45 GMT
if-none-match: "12341234"

Почему Chrome не отправляет то же самое при обновлении страницы? Я за поведение, которое работает в .Net:

context.Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate)

Ответы [ 6 ]

58 голосов
/ 15 февраля 2013

Потратив вчера на это полдня, я выяснил, что стало причиной проблемы для меня. Пока у вас есть инспектор объектов Chrome / Отладчик клиента / Сетевой монитор / Вещь, которая появляется, когда вы нажимаете F12, Chrome не будет отправлять заголовки запроса кеша. Период. (обновление: в более новых версиях Chrome есть флажок «Отключить кеш»). Даже если у вас не открыта вкладка «сеть» (например, есть открытая консоль javascript), этот флажок по-прежнему отключает кэширование.

Это печально, потому что отладка этого со стороны клиента обязывает вас оставить панель сети открытой, чтобы увидеть, какие заголовки отправляются и принимаются, а какие коды возвращаются. Без открытой панели сети невозможно узнать, кэшируется ли ваш контент со стороны клиента.

Если вы покопаетесь в журналах доступа к вашему серверу, вы заметите, что ваш сервер возвращает 304s (кэшированное содержимое) в ту минуту, когда вы закрываете окно отладки на вашем клиенте Chrome. Надеюсь это поможет.

Хром 24.0.1312.57

31 голосов
/ 18 июля 2013

Я нашел один ответ на это поведение при использовании HTTPS, подумал, что поделюсь тем, что нашел. Вы не указываете, запрашиваете ли вы через HTTP или HTTPS.

"На самом деле правило довольно простое: любая ошибка с сертификатом означает, что страница не будет кэширована."

https://code.google.com/p/chromium/issues/detail?id=110649

Если вы используете самозаверяющий сертификат, даже если вы скажете Chrome добавить исключение для него, чтобы страница загружалась, ресурсы этой страницы не будут кэшироваться, а последующие запросы не будут иметь If-Modified- С заголовка.

12 голосов
/ 28 ноября 2011

По моему опыту, вам нужно больше, чем просто "Приватный" заголовок Cache-Control.Вам нужно либо «Max-Age», либо «Expires», чтобы Chrome повторно проверил контент на сервере.

Помните, что повторная валидация начнется только после истечения этих значений времени, поэтому их может потребоваться установить на небольшое значение.

4 голосов
/ 08 марта 2014

Дополнительно (https://stackoverflow.com/a/14899869/362780):

F12> Настройки> Общие> Отключить кэш (когда открыт DevTools) -> снимите этот флажок ...

0 голосов
/ 08 декабря 2018

Браузеры имеют много противоречивого поведения, когда дело доходит до кеширования.Вы можете ожидать, что если ответ содержит дату последнего изменения, то браузер подтвердит его перед повторным использованием.Но на самом деле ни один из основных браузеров не делает этого.

Идеальные настройки для вашей ситуации зависят от того, когда вы хотите, чтобы браузер прошел повторную проверку, см. Ссылку ниже.

Мало того, что браузеры действуют противодействующим,разные браузеры также ведут себя по-разному в одной и той же ситуации.Например, когда пользователь нажимает кнопку обновления.

Вы можете прочитать, как различные браузеры (Internet Explorer, Edge, Safari, FireFox, Chrome) ведут себя с различными директивами кэширования (Etag, последнее изменение, must-повторная проверка, истекает, максимальный возраст, без кеширования, без хранения) на https://gertjans.home.xs4all.nl/javascript/cache-control.html

0 голосов
/ 04 марта 2014

Я знаю, что этот вопрос старый, но все же .. Я заметил, что Chrome запоминает последнее обновление, которое вы сделали.Поэтому, если вы нажмете Ctrl + Shift + R (обновление и удаление кэша) и нажмете Ctrl + R (просто обновление), Chrome продолжит удаление кэша и не отобразит 304 в полученном ответе.Для этого есть обходной путь.Нажмите Ctrl + Shift + R, а затем перейдите в адресную строку, сфокусируйтесь и нажмите Enter.Если ваши etags установлены правильно, и ваш сервер готов обслуживать 304, вы увидите новый код ответа в отладчике - 304. Так что он работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...