服务端部署前端页面,浏览器客户端缓存问题分析

当Nginx服务器上的Angular前端页面更新后,Chrome浏览器由于缓存机制可能无法加载最新文件。通过修改Nginx配置添加Cache-Control头可解决html文件缓存,但对diskcache中的js等文件无效。用户需手动清空缓存或使用F5强制刷新。Nginx配置中针对html文件的Cache-Control策略可确保index.html不被缓存,从而拉取最新资源。
摘要由CSDN通过智能技术生成

问题背景

服务端:Nginx 部署 Angular 项目打包的前端页面,Nginx 使用默认配置
客户端:Chrome
问题现象:项目已更新Nginx的前端页面文件,客户端访问服务端页面时,仍然访问不到更新的文件(如 js 文件)

问题处理

Nginx添加配置后重启Nginx。

location / {
            root   html;
            index  index.html index.htm;
            if ($request_filename ~* .*\.(htm|html)$) 
            {                               
                add_header Cache-Control "no-store, no-cache, max-age=0, must-revalidate";
            }
           }

Chrome 需要清空缓存,重新加载服务端前端页面,仅添加 Nginx 配置,无法解决 Chrome 获取 disk cache 问题

问题分析

Chrome 打开 F12,网络 Tab,文件从 disk cache 中获取,Nginx 的 access.log 没有请求日志。
在这里插入图片描述

客户使用 Chrome 访问页面,一般通过收藏夹链接跳转,地址栏回车跳转,行为等同于以下 js 代码中其中一个,这两种情况,Nginx 均收到不到请求日志,浏览器是从 disk cache 中获取返回文件。

// 在新标签页打开
window.open('url');
// 在当前标签页打开
window.location.replace('url');

如果客户点击页面刷新按钮(即F5),Nginx 能够收到请求日志,并能够返回最新的前端文件,行为等同于以下 js 。

window.location.reload();

实际使用场景,客户会通过收藏夹访问,添加 Nginx 配置,匹配到 html 文件,即添加请求头。

Cache-Control "no-store, no-cache, max-age=0, must-revalidate"

Chrome 清空缓存后,再次加载页面,不会缓存 index.html 到 disk cache,后续再更新前端文件,index.html 文件更新,能够拉取到最新的 js , css 等文件。

# Angular 项目打包命令
ng bulid --prod

参考:
Cache-Control - HTTP | MDN
Module ngx_http_core_module_location
Module ngx_http_rewrite_module_if

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值