Кешированный nginx index.html принудительно перезагрузить

Во время миграции сервера в новой конфигурации nginx отсутствовали директивы управления кешем. Следовательно, мы получили кешированный index.html, что очень плохо для нашего SPA, который больше не обновляется, если мы развертываем новый код. Нам нужно, чтобы index.html не кэшировался.

Это была наша (плохая) конфигурация nginx, которая была онлайн несколько дней:

server {
  listen 80;

  location / {
    root   /usr/share/nginx/html;
    index  index.html index.htm;
    try_files $uri $uri/ /index.html;
  }

  error_page   500 502 503 504  /50x.html;

  location = /50x.html {
    root   /usr/share/nginx/html;
  }

}

Мы исправили наш конфиг:

server {
  listen 80;

  root /usr/share/nginx/html;

  location / {
    index  index.html index.htm;
    try_files $uri $uri/ /index.html;
    add_header Cache-Control "no-store, no-cache, must-revalidate";
  }

  location ~* \.(js|jpg|jpeg|gif|png|svg|css)$ {
    add_header Cache-Control "max-age=31536000, public";
  }

  error_page   500 502 503 504  /50x.html;

  location = /50x.html {
    root   /usr/share/nginx/html;
  }

}

ВОПРОС

Клиенты, которые были на нашей веб-странице в течение последних дней, кэшировали старый index.html. Как мы можем заставить их браузеры удалить кэшированные index.html?

Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
5
0
3 475
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Невозможно вручную сбросить кеш браузера на стороне пользователя (браузера), пока клиент не запрашивает сервер для нового контента. В этом случае может пригодиться доступ к любым скриптам, которые вы SPA скачиваете без кеша. В этом случае вы можете изменить этот скрипт и запустить принудительную перезагрузку страницы (но будьте осторожны - вам нужен какой-либо флаг для предотвращения постоянной принудительной перезагрузки после каждой загрузки страницы). Например, если у вас на сайте есть GTM — это может помочь.

УПД: Я не специалист по js, но вам нужно было добавить тег GTM на все страницы, как этот js-скрипт:

function getCookie(name) {
  let matches = document.cookie.match(new RegExp(
    "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\/\+^])/g, '\\$1') + "=([^;]*)"
  ));
  return matches ? decodeURIComponent(matches[1]) : undefined;
}

was_reloaded = getCookie('was_reloaded')
alert(was_reloaded)
if (was_reloaded != 'yes') {
        document.cookie = "was_reloaded=yes; path=/; max-age=3600;"
    location.reload();
} }

Действительно, мы используем GTM, не могли бы вы уточнить, как мы можем использовать его для принудительной перезагрузки только для старой версии?

Stuck 18.12.2020 01:10

@Stuck Я обновил ответ с примером. Надеюсь это поможет.

Talkerbox 21.12.2020 15:03

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

AngularJS: устаревший пользовательский интерфейс, пытающийся загрузить файлы HTML с кэшем, которые больше не существуют при развертывании новой версии
Почему пул и кешированный метод имеют почти одинаковое время выполнения?
Изменения HTML не обновляются только в Chrome
Как обрабатывать необязательную черту в подписи функции в стабильной версии?
Использование подклассов URLCache с URLSession
Алгоритм: как рассчитать коэффициент попадания/промаха кеша с учетом времени
Является ли когерентность кеша проблемой только при сохранении, а не при загрузке?
Как лучше всего решить проблему отправки мутаций с нескольких вкладок браузера в RTK Query?
Как кэшировать установку dotnet в GitHub Actions
Кэширование в .Net Core с помощью BackgroundService завершается ошибкой: «Добавление указанного счетчика к семафору приведет к превышению максимального значения ошибки счетчика»