解决 Astro 站点托管到某些平台 404 页面返回 200 状态码的问题
390 字
2 分钟
解决 Astro 站点托管到某些平台 404 页面返回 200 状态码的问题
问题
把博客部署到 EdgeOne 之后研究 SEO 时偶然发现 EdgeOne 居然对显示为 404 的页面返回 200 状态码,之后换到其他平台居然也都有这个问题。
简单研究了下,发现似乎只要对应的静态文件存在就会返回 200 状态码,即使其 rewrite 到了 404。

一开始尝试在 Astro 页面 rewrite 到 404 时设置返回 404 状态码,当然失败了,因为设置 Astro 的构建模式是 static,SSG 肯定没法指定状态码的。
后来实在想不到什么解决方法了,直接选择重定向到了 404,结果就发现了,这 TMD 404 页面也返回 200 状态码啊?
解决
EdgeOne
但是 EdgeOne 对于确实不存在的页面的处理是正常返回 404 的,所以我一想,我直接重写请求到不存在的页面不就行了?
天才如我,直接在 edgeone.json 加了重写规则:
{ "rewrites": [ { "source": "/bangumi", "destination": "/bangumi-off" }, { "source": "/gallery", "destination": "/gallery-off" }, { "source": "/404", "destination": "/114514" } ]}反正客户端看不到实际请求重写到了哪里,只要返回 404 就行。

问题完美解决。
Vercel
后来换了 Vercel,发现 Vercel 也有这个问题。
不过得益于 Vercel 的配置功能强大,可以用相对正经的方法解决这个问题:
{ "routes": [ { "src": "/404", "status": 404 }, { "src": "/bangumi", "status": 404 } ]}编辑历史
- 2026-06-08:优化了某些部分的表述,增加了 Vercel 的解决方法。
解决 Astro 站点托管到某些平台 404 页面返回 200 状态码的问题
https://qingfengawa.top/posts/fix-edgeone-status-code
FengのBlog