Заголовок HTTP Cache-Control работает только на localhost - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь настроить кэширование с 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.


Production

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).

Вопрос

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

1 Ответ

0 голосов
/ 10 мая 2018

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

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

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

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

RFC2616

13.2.2 Эвристическое истечение срока действия

Поскольку исходные серверы не всегда предоставляют явное время истечения, HTTP-кэши обычно назначают эвристическое время истечения, используя алгоритмы, которые используют другие значения заголовка (например, Last-Modified время), чтобы оценить вероятное время истечения. HTTP / 1.1 спецификация не предоставляет конкретные алгоритмы, но налагает наихудшие ограничения на их результаты. С эвристического истечения времена могут поставить под угрозу семантическую прозрачность, они должны использовать осторожно, и мы призываем исходные серверы предоставлять явные время истечения максимально.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...