Во время миграции сервера в новой конфигурации 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
?
Невозможно вручную сбросить кеш браузера на стороне пользователя (браузера), пока клиент не запрашивает сервер для нового контента. В этом случае может пригодиться доступ к любым скриптам, которые вы 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();
} }
@Stuck Я обновил ответ с примером. Надеюсь это поможет.
Действительно, мы используем GTM, не могли бы вы уточнить, как мы можем использовать его для принудительной перезагрузки только для старой версии?