Cache-Control: отсутствие кеша в ответе заголовка запроса не заменяет ранее кэшированный ответ до перезагрузки страницы в Safari

Я использую AngularJS в Safari и в гибридном приложении iOS.

У меня есть HTTP-ответ, который кэшируется в течение 10 минут, используя следующие заголовки. Этот ответ кэшируется. Мы будем называть этот ответ А на шаге 1.

Cache-Control:public, max-age=600

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

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

Cache-Control:no-cache, no-store, must-revalidate Pragma: no-cache Expires: {Current date time}

Этот ответ (ответ B) совпадает с ответом A, за исключением того, что он имеет различную информацию в теле. Заголовки ответов идентичны, кроме заголовка ответа «Дата». Выполнение этого запроса успешно обходит кеш и извлекает новый ресурс с сервера, и все хорошо.

Однако этот новый ответ не заменяет предыдущий ответ в кеше. Например, если я перешел на другую страницу (которая не вызывает перезагрузку страницы, поскольку мое приложение является SPA с помощью AngularJS), а затем переместилось обратно на страницу, которая делает тот же запрос, который был сделан на шаге 1, он получает ответ A вместо ответа B. Я ожидаю, что вместо ответа будет возвращен ответ B.

Это только проблема в Safari. Chrome и IE работают правильно, так как любые будущие запросы возвращают ответ B.

Однако в Safari, если я перезагружаю страницу ( ⌘ + R ), она полностью игнорирует кеш и делает новый запрос на тот же ресурс. Если я попал в строку URL Safari, он не игнорирует кеш, но все равно использует Response A.

Как заставить Safari вести себя как другие браузеры и заменять кешированные ответы при создании новых запросов, которые обходят кеш?

Обобщить:

  1. Выполните запрос без установки заголовков Cache-Control в запросе. Получите ответ с заголовками Cache-Control под названием Response A.

  2. Сделайте новый запрос с явным заголовком запросов Cache-Control, Pragma и Expires, который обходит запрос, получает обновленный ответ B.

  3. Перемещайтесь, а затем назад, создавая новый запрос так же, как на шаге 1. Я ожидаю получить ответ B, но вместо этого возьму Response A. Ответ B на шаге 2 не заменяет Response A, хотя заголовки ответов в основном идентичны (кроме заголовка Date), а тело отличается.

PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.