Подтвердить что ты не робот

Браузер Chrome не отправляет if-modified-since с заголовка на сервер

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

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"

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

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

Ответ 1

По моему опыту вам нужно больше, чем только заголовок "Private" Cache-Control. Вам нужно либо "Макс-возраст", либо "Истекает", чтобы заставить Chrome повторить проверку содержимого на сервере.

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

Ответ 2

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

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

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

Chrome 24.0.1312.57

Ответ 3

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

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

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

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

Ответ 4

Кроме того (fooobar.com/questions/163997/...):

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

Ответ 5

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

Ответ 6

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

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

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

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