Я пытаюсь настроить кеширование с помощью Cache-Control для конечной точки REST в моем веб-приложении, оно работает локально, но когда я развертываю его на нашем производственном сервере, браузер просто не кэширует ответы.
Конечная точка запрашивается с помощью параметризованного запроса ajax (как показано ниже).
Некоторые важные примечания:
Я использую параметр очиститель кеша (_), который представляет собой временную метку unix, сгенерированную при загрузке страницы. Это не меняется в запросах ajax.
localhost использует HTTP, а производство - HTTPS. Сертификат действителен, ошибок нет.
И Firefox 59.0.2, и Chrome 66.0.3359.139 демонстрируют такое поведение, поэтому я предполагаю, что это что-то в конфигурации.
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).
Что мешает браузеру кэшировать ответы при разговоре с производственным сервером?
Я показываю первые запросы до того, как произойдет кеширование. На localhost следующие запросы правильно загружаются из кеша, к сожалению, в продакшене. Я добавлю кешированный ответ от localhost, когда у меня будет возможность.





Через 2 дня я пытаюсь снова, и кеширование работает нормально. (Клянусь, я не сумасшедший)
Тот же запрос, те же заголовки, тот же ответ.
Я подозреваю, что он попадает в какую-то эвристику, которая отменяет ответ Cache-Control.
Это, безусловно, связано с тем фактом, что эта конечная точка не указала ранее Cache-Control, поэтому браузер игнорирует заголовок, поскольку эвристика предпочитает повторную выборку вместо кеширования, он не может ошибиться в том, чтобы быть более осторожным.
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.
В общем, это лучшее объяснение, которое у меня есть.
Я тоже обнаружил это неожиданное поведение. Повторная попытка в частном окне заставила его работать должным образом и подтвердить, что это браузер, играющий в игры.
И ваш локальный, и удаленный запрос / ответы выше не показывают кеширование (т.е. им дается 200 вместо 304 или аналогичный). У вас есть пример вывода, в котором работает ваше кеширование?