欢迎光临
我们一直在努力

《一次艰难的 404 排查:从 Service Worker 到 Nginx 204》

一、奇怪的“幽灵 404”

前段时间,我的网站(IT-Tools 开发者工具箱)里有一个聚合搜索页面 /search/,出现了非常诡异的现象:

  • 有时候点进去会 404,刷新也不行。

  • 清理浏览器缓存后,立刻恢复正常。

  • 但过了一阵子(或者关闭浏览器重开),404 又回来了。

  • 最奇怪的是:某些手机浏览器能正常打开,另一些却打不开。

这说明问题不是服务器文件缺失,也不是 Nginx 配置全错,否则怎么清缓存就能好呢?背后一定有某个“阴魂不散”的缓存机制在作祟。

二、怀疑对象:Service Worker

我打开开发者工具,发现网站注册了一个 Service Worker(sw.js)。这个 Service Worker 的作用是拦截网络请求,优先返回缓存内容,从而实现离线访问或加速二次加载。

然而,当网站更新后(比如修复了某个资源的路径),Service Worker 依然返回旧版本的页面。旧页面里引用的资源在新版本中已经被删除,于是浏览器报 404。

清理缓存时,Service Worker 被注销,新页面正常加载。但过一会儿,前端代码又会重新注册一个 Service Worker,于是问题再次出现。

三、为什么手机表现不一致?

  • 支持 Service Worker 的浏览器(比如较新的 Chrome)会注册 SW,于是容易出现 404。

  • 不支持或禁用 SW 的浏览器(一些旧版手机浏览器或自带浏览器)每次直接从服务器取文件,永远正常。

这就是“有的能进主页,有的不能”的根本原因。

四、解决方案:彻底禁用 Service Worker

我的网站是纯在线工具站,不需要离线访问。与其让 SW 带来麻烦,不如彻底关掉。

最干净的做法是:让浏览器请求 sw.js 时收到一个“无内容”的响应,从而不再注册 Service Worker。

在 Nginx 配置中添加一条规则:


location = /sw.js {     return 204; }


  • 204 No Content 告诉浏览器:这个文件存在,但没有任何内容,请不要注册。

  • 重载 Nginx 后,所有新访问都不会再建立 Service Worker。

五、清理残留的“幽灵”

对于已经注册了旧 SW 的用户(比如我自己的电脑),服务器虽然返回 204,但旧 SW 还在浏览器里运行,需要手动清除:

  • 打开 chrome://serviceworker-internals/,找到网站对应的 SW,点击 Unregister。

  • 清除浏览器缓存(“所有时间”的“缓存的图片和文件”)。

  • 关闭浏览器重开。

之后访问 /search/ 再也没出现过 404。

六、最终效果

  • /search/ 页面现在永远直接从服务器加载,不会因为缓存导致 404。

  • 其他所有工具功能不受任何影响。

  • 用户不需要做任何操作,新访问者自动获得正确的配置。

七、小结

如果遇到类似“清缓存就好,过会儿又坏”的诡异问题,优先检查 Service Worker。对于不需要离线功能的网站,直接禁用 SW 是最简洁、最稳定的方案。

一行 Nginx 配置,换来永久的宁静。


后记

这一路排查虽然折腾,但也让我对浏览器的缓存机制、Service Worker 的行为、Nginx 的配置有了更深的理解。希望这篇文章能帮到同样被“幽灵 404”困扰的你。

网站地址:https://www.hight.xinhttps://www.hight.xin

赞(0)
未经允许不得转载:171主机测评 » 《一次艰难的 404 排查:从 Service Worker 到 Nginx 204》
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址