一、奇怪的“幽灵 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.xin
https://www.hight.xin




