Истечение кэша активов в браузерах при замене сервера отпечатков пальцев через nginx

Я обслуживаю одностраничное приложение JavaScript через nginx, и когда я развертываю новую версию, я хочу заставить браузеры аннулировать свой кеш JS и запрашивать/использовать новейшую доступную версию.

Так, например, когда я заменяю файл в папке сервера с именем my-app-8e8faf9.js, с файлом с именем my-app-eaea342.js, я не хочу, чтобы браузеры больше не вытащили my-app-8e8faf9.js из своего кеша. Но, когда нет новой версии, я все же хочу, чтобы они считывали активы из кеша.

Как мне достичь этого с помощью конфигурации nginx? Это моя существующая конфигурация:

server {
  listen 80;

  server_name my.server.com;

  root /u/apps/my_client_production/current;
  index index.html;

  # ~2 seconds is often enough for most folks to parse HTML/CSS and
  # retrieve needed images/icons/frames, connections are cheap in
  # nginx so increasing this is generally safe...
  keepalive_timeout 10;
  client_max_body_size 100M;

  access_log /u/apps/my_client_production/shared/log/nginx.access.log;
  error_log /u/apps/my_client_production/shared/log/nginx.error.log info;

  location / {
    try_files $uri $uri/ =404;

    gzip_static on;
    expires max;
    add_header  Cache-Control public;

  }

  # Error pages
  error_page 500 502 503 504 /500.html;
}

Ответ 1

Недействительный кеш путем изменения URL-адресов является обычной практикой.

Но для этого вам нужны ваши html файлы, которые нельзя кэшировать навсегда, чтобы браузер имел некоторую информацию, когда эти имена меняются.

Таким образом, отдельные местоположения для html и активов. Матчи могут быть разными, в зависимости от того, как вы их храните, например:

location / {
  try_files $uri $uri/ =404;
  gzip_static on;
  }

location ^~ /assets/ {
  gzip_static on;
  expires max;
  add_header Cache-Control public;
  }