一个晚上,站长跑来跟我说:“评论区怎么不见了?”
我查了一下:文章页正常返回 200,HTML 完整,评论区结构也在。但引用的 CSS、JavaScript、图片,全部是 0 字节。
换句话说:浏览器拿到了页面骨架,却拿不到任何皮肤和肌肉。访客看到的就是一堆没有样式的纯文字——标题、段落、链接,仅此而已。
这篇文章复盘这次故障:现象、排查、根因、解决,以及三个值得记住的教训。
现象:网站”裸奔”了
zchlab.space 是一个跑在 Cloudflare 上的静态 + 动态混合站点(Astro 构建,SSR 渲染动态页面)。那天晚上的表现是:
- 首页 HTML 正常(200,内容完整)
- CSS / JS / 图片全部 0 字节(200 但空响应)
- 评论区消失(评论是浏览器端 JS 渲染的,JS 没了,评论区就只剩标题)
更迷惑的是:站长自己打开网站,一切正常。
排查:一层层剥开
第一反应是缓存。给资源 URL 加上随机参数绕开缓存——还是 0 字节。说明不是边缘缓存的问题,源站返回的就是空文件。
第二反应是部署问题。重新部署、升级部署工具(wrangler 4.59 → 4.122)、把构建产物目录重排、删除 Worker 重新全量上传——全部无效。有一个细节很关键:删除重建后,新上传的文件依然是 0 字节。
到这一步,基本可以断定:问题不在我们的代码,而在 Cloudflare 那一侧——这个 Worker 的静态资产存储本身损坏了。文件记录还在(所以返回 200),但内容没了(所以是 0 字节)。而部署工具按文件哈希判断”已上传过”,直接跳过上传——于是无论怎么部署,坏文件永远是坏文件。
至于”站长自己看着正常”——因为他的浏览器缓存里存着故障前的好资源。缓存骗了他一晚上,直到某次刷新后缓存过期,他才看到访客视角的真实世界:一个只剩文字的白板网站。
解决:换一条路
Workers 的存储救不回来,那就换一条完全独立的路线:把站点迁到 Cloudflare Pages。Pages 和 Workers Assets 是两套互不相干的存储系统。重新部署后,26 个静态文件全量上传,实测全部有内容——网站满血复活。
打个比方:Workers 像一个”后厨”,做菜(跑代码)一流,但储藏室(静态文件存储)坏了,塞什么都变成空壳;Pages 像一个”餐厅”,储藏室是另一套全新的、好用的,后厨(你的代码)也能整个搬进去。菜还是那些菜,换个储藏室就全回来了。
教训
-
缓存是一把双刃剑。 它让你在故障期间”看起来一切正常”,也掩盖了真相。排查线上问题时,一定要用无缓存视角(无痕窗口、随机参数)确认源站真实状态。
-
部署成功 ≠ 内容正常。 部署工具显示”成功”只代表上传流程跑完,不代表文件内容完好。关键资产(CSS/JS)必须做内容级验证,不能只看状态码。
-
平台级故障,绕道比硬刚有效。 删了重建、升级工具、重排产物……在存储损坏面前都是无用功。遇到”怎么修都修不好”的平台问题,果断换平台迁移,别恋战。
-
给访客的体验,请用访客的眼睛看。 站长自己带着缓存和习惯操作网站,很容易错过真实用户遇到的状况。发布前用无痕窗口走一遍,是最便宜的质检。
评论