Заголовок HTTP Cache-Control работает только на localhost

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

Конечная точка запрашивается с помощью параметризованного запроса ajax (как показано ниже).

Некоторые важные примечания:

  • Я использую параметр очиститель кеша (_), который представляет собой временную метку unix, сгенерированную при загрузке страницы. Это не меняется в запросах ajax.

  • localhost использует HTTP, а производство - HTTPS. Сертификат действителен, ошибок нет.

  • И Firefox 59.0.2, и Chrome 66.0.3359.139 демонстрируют такое поведение, поэтому я предполагаю, что это что-то в конфигурации.

Localhost

Request URL: http://localhost:8080/webapp/rest/events?_=1525720266960&start=2018-04-29&end=2018-06-10
Request Method: GET
Status Code: 200 OK
Referrer Policy: no-referrer-when-downgrade

=== Request ===
Accept: application/json, text/javascript, */*; q=0.01
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Cookie: JSESSIONID=<token>
Host: localhost:8080
Referer: http://localhost:8080/webapp/
X-Requested-With: XMLHttpRequest

=== Response ===
Cache-Control: no-transform, max-age=300, private
Connection: keep-alive
Content-Length: 5935
Content-Type: application/json

Следующие запросы (для тех же параметров) эффективно загружаются из кеша с той лишь разницей, что: Status Code: 200 OK (from disk cache)

Что кажется нормальным, поскольку я не хочу повторять валидацию. Ресурс должен быть извлечен снова, без проверки, только после того, как он станет устаревшим после продолжительности max-age, указанной в Cache-Control.


Производство

Request URL: https://www.example.org/webapp/rest/events?_=1525720216575&start=2018-04-29&end=2018-06-10
Request Method: GET
Status Code: 200 OK
Referrer Policy: no-referrer-when-downgrade

=== Request ===
Accept: application/json, text/javascript, */*; q=0.01
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Cookie: JSESSIONID=<token>
Host: www.example.org
Referer: https://www.example.org/webapp/
X-Requested-With: XMLHttpRequest

=== Response ===
Cache-Control: no-transform, max-age=300, private
Connection: close
Content-Length: 5935
Content-Type: application/json

В этом случае ответ никогда не загружается из кеша впоследствии.


Я удалил некоторые заголовки, которые считал лишними (Server, X-Powered-By, User-Agent, Date).

Вопрос

Что мешает браузеру кэшировать ответы при разговоре с производственным сервером?

И ваш локальный, и удаленный запрос / ответы выше не показывают кеширование (т.е. им дается 200 вместо 304 или аналогичный). У вас есть пример вывода, в котором работает ваше кеширование?

John Mitchell 08.05.2018 03:33

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

9too 08.05.2018 04:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
994
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Через 2 дня я пытаюсь снова, и кеширование работает нормально. (Клянусь, я не сумасшедший)

Тот же запрос, те же заголовки, тот же ответ.

Я подозреваю, что он попадает в какую-то эвристику, которая отменяет ответ Cache-Control.

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

RFC2616

13.2.2 Heuristic Expiration

Since origin servers do not always provide explicit expiration times, HTTP caches typically assign heuristic expiration times, employing algorithms that use other header values (such as the Last-Modified time) to estimate a plausible expiration time. The HTTP/1.1 specification does not provide specific algorithms, but does impose worst-case constraints on their results. Since heuristic expiration times might compromise semantic transparency, they ought to used cautiously, and we encourage origin servers to provide explicit expiration times as much as possible.

В общем, это лучшее объяснение, которое у меня есть.

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

user2219808 15.10.2020 23:49

Другие вопросы по теме