Понимание кэширования по умолчанию в NGINX - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть конфиг NGINX в разных местах. Все они возвращают человека index.html. index.html строятся с каждым развертыванием. Они включают script теги для файлов JavaScript, которые поставляются с хэшем содержимого в имени файла, чтобы разрушить кэш.

Моя проблема в том, что после развертывания некоторые из необходимых сценариев 404 выполняются, потому что загруженный index.html имеет старый хэш содержимого в именах файлов JS. Кажется, проблема в том, как доставляется index.html, потому что это старая версия index.html, которая была загружена клиентом.

Это пример расположения в моей конфигурации NGINX:

location /my-route {
  try_files $uri /my-route/index.html;
}

Когда я проверяю заголовки ответа, я вижу ETag для всех файлов index.html. Разве этого не должно быть достаточно для обеспечения правильного поведения кэширования для всех файлов index.html?

Мой следующий подход - добавить заголовок Cache-Control. Но я не знаю, решит ли это мою проблему, потому что я не могу точно объяснить, почему это было бы правильное решение (но я хотел бы узнать об этом).

location /my-route {
  add_header Cache-Control "must-revalidate";
  try_files $uri /my-route/index.html;
}

1 Ответ

0 голосов
/ 29 января 2019

Чтобы стратегия очистки кэша работала для связанных ресурсов (файлов JavaScript и т. Д.), Как вы ее описали, вам нужно убедиться, что браузеры всегда имеют свежую копию index.html.

Вот один консервативный способ достичь того, что вам нужно. Установите блок location только для файлов HTML и отдельный блок местоположения для других ресурсов, которые имеют хэш содержимого в своих именах файлов. Для HTML-файлов вам нужно:

add_header Cache-Control "no-store";

Для ресурсов с хэшем содержимого в именах файлов используйте:

add_header Cache-Control "max-age: 31536000";

Чтобы ответить на ваш вопрос о том, достаточно ли отправки ETag для ваших файлов index.html, ответ - нет. Без заголовка Cache-Control браузеры используют свой собственный алгоритм для принятия решения, извлекать ли данные из собственного кэша или подключать к сети заголовок запроса If-None-Match для проверки копии, которая у них уже есть.

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

...