解决 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 加了重写规则:

edgeone.json
{
"rewrites": [
{
"source": "/bangumi",
"destination": "/bangumi-off"
},
{
"source": "/gallery",
"destination": "/gallery-off"
},
{
"source": "/404",
"destination": "/114514"
}
]
}

反正客户端看不到实际请求重写到了哪里,只要返回 404 就行。

大功告成
大功告成

问题完美解决。

Vercel#

后来换了 Vercel,发现 Vercel 也有这个问题。
不过得益于 Vercel 的配置功能强大,可以用相对正经的方法解决这个问题:

vercel.json
{
"routes": [
{
"src": "/404",
"status": 404
},
{
"src": "/bangumi",
"status": 404
}
]
}

编辑历史#

  • 2026-06-08:优化了某些部分的表述,增加了 Vercel 的解决方法。
解决 Astro 站点托管到某些平台 404 页面返回 200 状态码的问题
https://qingfengawa.top/posts/fix-edgeone-status-code
作者
QingFeng
发布于
2026-06-04
更新于
2026-06-08
许可协议
CC BY-NC-ND 4.0

评论区

Profile Image of the Author
QingFeng
不会做游戏就不要做
站点统计
文章
4
分类
2
标签
11
总字数
13,827
运行时长
0
最后活动
0
分类
标签

文章目录