一个棘手的页面缓存问题

Daotin 于 2025-05-16 发布 编辑

背景

最近在开发最近在开发一个前端项目的时候,遇到一个非常棘手的缓存问题,这里记录下最后的解决方案。

部署流程:普通的vue H5项目,嵌入到app显示,部署就是打包后复制到nginx的一个目录下。

现状:在测试环境ok,但是部署到开发环境就一直不生效。(大概10-30分钟才生效)

尝试

1、app卸载重装无效。直接使用浏览器访问无效(但是手机浏览器生效时间比嵌入的webview要快)。确认的确是缓存问题。

2、代码确认没有使用cdn,Service Worker,app也没有做webview的缓存配置(测试环境是ok的)

3、nginx增加index.html缓存配置,禁用index.html的缓存,但是没有效果

location /osc-H5-prod/ {
    alias /var/www/html/osc-H5-prod/;
    index index.html;
    try_files $uri $uri/ /osc-H5-prod/index.html;
    location = /osc-H5-prod/index.html {
        add_header Cache-Control "no-cache, no-store, must-revalidate";
        add_header Pragma "no-cache";
        add_header Expires "0";
    }
}

2、在osc-H5-prod同级目录,新增osc-H5-prod123目录,可以生效。 但是把osc-H5-prod123改成osc-H5-prod,又不能生效。即便是把osc-H5-prod中的index.html 换成index.html1,页面依然可以访问,但是把osc-H5-prod删掉,页面会报错,不删除就是旧的,好像只要osc-H5-prod目录存在,就访问的缓存数据。

临时解决方案

在APP加载H5页面的URL后面追加一个动态的时间戳或版本号参数,例如:

http://yourdomain.com/osc-H5-prod/index.html?_v=1715500000

每次点击链接打开的时候,都更新时间戳。

这会使每次请求的 URL 对于缓存系统来说都是“新的”,从而绕过大部分基于 URL 的缓存。但这只是权宜之计,治标不治本。