gluck59
@gluck59
Виртуальный глюк

Как бороться с излишне агрессивным браузерным кэшированием?

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

Клиент ходит аяксом на API и получает оттуда JSON. Точнее должен ходить, но упорно тащит все из кэша. Это становится совсем неприятным, когда клиенту нужно авторизоваться: вместо токена в ответ он может получить либо старый токен, либо непонятно что.

Настраивать управление кэшированием на сервере совершенно бесполезно: ни Хром, ни Сафари директивам не следуют и тащат все из кэша. Я использовал ?_nocache= как последний способ, но браузерам пофиг. Можно даже подсунуть аяксу левый адрес сервера — эффект будет тот же. То есть создается впечатление, что на самом деле обращения к серверу не было.

87f672430d974cbcb3a8f83df7f4483c.jpg

Сейчас сервер отдает еще и такие заголовки:
Cache-Control:max-age=10
Date:Fri, 22 Apr 2016 10:07:15 GMT
Expires:Fri, 22 Apr 2016 10:07:25 +0000
Last-Modified:Fri, 22 Apr 2016 10:07:15 GMT

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

Что делать? Как бороться с этой гадостью?

UPD:
Мобильный Сафари пошел еще дальше. Если залогиниться, срубить Сафари, "удалить кэш и всю историю всех сайтов" в настройках, перезагрузить телефон и зайти снова — без лишних вопросов обнаруживаем себя залогиненными как ни в чем ни бывало...
  • Вопрос задан
  • 1024 просмотра
Решения вопроса 1
alsopub
@alsopub
Может одинаковый ETag виноват? Или значение nocache не меняется.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
dimasmagadan
@dimasmagadan
с такими заголовками оно и будет из кэша брать.

поставьте что-то такое:
'Expires' => 'Wed, 11 Jan 1984 05:00:00 GMT',
'Cache-Control' => 'no-cache, must-revalidate, max-age=0',
'Pragma' => 'no-cache',

у будут у вас всегда актуальные данные.

кэшировать, даже на короткий срок, ответ от апи лучше на стороне клиента.
то есть сервер всегда должен отдавать с заголовками запрещающими любое кэширование.
если нужно что-то кэшировать, кладите ответ + timestamp в локал сторидж, на стороне клиента
затем сравнивайте этот таймстэмп с текущим временем, если он устарел, обновляйте с сервера
Ответ написан
p00h
@p00h
Фехтовальщик-стропальщик
Присоединяюсь к Алексей. Лично у меня все прекрасно работает и в хроме, и в лисе. Веротяно, здесь закралась какая-то ошибка с Вашей стороны.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы