这类问题我又碰上了一次。项目用 Next.js 15 的 app 目录,robots.txt 放在 public 下,本地 dev 能访问,部署到 Vercel 后返回 404。GSC 里 robots 抓取失败,sitemap 一行都读不到。

第一反应是「CDN 把 /robots.txt 的 404 缓存了下来」,验证下来不成立。

排查方向其实有限,先把可能性排一排。构建产物里 public 下的静态文件没被复制到输出目录;项目里同时存在 app/robots.ts 与 public/robots.txt,路由冲突;构建产物上传时 public 目录被排除在部署白名单之外。

第一件事是确认部署后的实际响应

curl -sI https://www.example.com/robots.txt | head -4

随后改用 metadata 路由统一输出

export default function robots(){return {rules:{userAgent:'*',allow:'/'},sitemap:'https://www.example.com/sitemap.xml'}}

接着删除 public 下的重复文件并重新构建

rm public/robots.txt && npm run build

刷新 CDN 后复验内容

curl -s https://www.example.com/robots.txt

白天有业务在跑,能验证的部分都压到了晚上做。

改完先别撤,确认这几项。改用 app/robots.ts 后文件稳定返回 200,GSC 里的 robots 读取恢复正常,sitemap 也重新被发现。

提醒一点。框架自带的 metadata 路由优先于静态文件,两处都放同名文件时以路由为准,排查时先看构建产物里到底有哪个。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189