如果你最近也在做 Google AdSense 审核,可能会遇到一种很让人头疼的情况:明明前几天 ads.txt 还是“已授权”,网站也能正常访问,过了几天却突然变成“未找到”。
我自己的站点 apepine.com 也遇到过类似情况。最开始我以为是 ads.txt 文件没放对,后来一通排查下来,才发现事情没有那么简单。很多时候,问题并不是文件真的丢了,而是 Google 在抓取的时候,没有稳定拿到它。

最常见的原因有这几类:文件在抓取时临时不可用(例如返回 404、5xx,或是“软 404”)、根域名没有正确指向 ads.txt、www / 非 www、http / https 没有做好重定向、robots.txt 阻止了抓取,或者文件里有格式错误、空格、逗号、编码问题。AdSense 还明确说,抓取会从根域名开始,并且要求 ads.txt 返回 HTTP 200;如果响应头是 404,文件会被视为不存在。
可以直接按这个顺序排查:先在浏览器里分别打开 https://你的域名/ads.txt 和 http://你的域名/ads.txt,确认都能正常显示并返回 200;再检查 robots.txt 有没有挡住 /ads.txt;然后对照 AdSense 里的发布商 ID,确认文件内容只有正确那一行,且没有多余空格或错误字符。官方也强调,ads.txt 必须放在根目录,且发布商 ID 要与 AdSense 账号一致。
注意:官方说明,ads.txt 的变更反映到 AdSense 里可能要几天,低流量站点甚至可能要一个月
这篇文章我把整个排查过程、容易忽略的坑,以及最后最有效的解决方法整理出来。希望对正在经历同样问题的你有帮助。
一、先说结论:ads.txt “未找到” 不一定真的是没找到
很多人看到 AdSense 里显示“未找到”,第一反应就是:
- 文件是不是没上传成功?
- 路径是不是错了?
- 代码是不是写错了?
这些都要查,但真正的情况往往更复杂。对于使用 Cloudflare、CDN、缓存规则或者防护规则的网站来说,Google 看到的结果,和你本地浏览器看到的结果,可能并不是同一个。
也就是说,你自己打开 https://你的域名/ads.txt 没问题,不代表 Google 每次来抓也都没问题。
二、我遇到的真实现象
我的站点一开始显示 ads.txt 已授权,说明 Google 已经成功读取过文件。可是在审核第 8 天,状态突然变成了“未找到”。这很奇怪,因为我并没有删除文件,网站也没有停机。
我后来去服务器上验证,发现:
https://apepine.com/ads.txt可以正常访问- 返回状态码是
200 OK - 内容也确实是正确的 ads.txt
这说明文件本身没有问题。
那问题出在哪?
很可能出在中间层,比如:
- Cloudflare 缓存
- 安全规则
- 某些边缘节点返回异常
- 短时间内抓取结果不稳定
这类问题最麻烦的地方在于:你自己看不出来,但搜索引擎和广告平台会受影响。
三、先别急着改文件,先做这 4 个检查
1. 直接访问 ads.txt
在浏览器里打开:
https://你的域名/ads.txt
如果能直接看到文件内容,说明基础访问没问题。
2. 用命令行检查状态码
在服务器或本地终端运行:
curl -I https://你的域名/ads.txt
正常情况下,你应该看到:HTTP/2 200
如果是 301、302、304、403、404,或者别的异常状态,就要继续往下查。
使用本地电脑的命令提示符窗口查看,输入win+r,调出输入框,输入cmd,回车,然后粘贴命令,如图:

如图,在服务器运行:

3. 看 Cloudflare 有没有拦截
如果你的网站使用了 Cloudflare,要特别注意:
- 缓存规则是否影响了
/ads.txt - 安全防护是否误伤了 Google 抓取
- 某些页面规则有没有把这个路径单独处理掉
4. 检查 ads.txt 内容本身
文件内容要符合 Google 的规范,常见格式大概是这样:
google.com, pub-xxxxxxxxxxxxxxxx, DIRECT, f08c47fec0942fa0
注意几点:
- 要放在网站根目录
- 文件名必须是
ads.txt - 不能写成
ads.txt.txt - 不要有多余空格、乱码、BOM 头
四、为什么 Cloudflare 很容易让 ads.txt 出问题
有些站长喜欢用 Cloudflare,我个人也很喜欢,我的博客猿猿松就是托管在Cloudflare,因为它速度快,也能挡掉不少垃圾流量。但对 ads.txt 这种文件来说,Cloudflare 也可能带来麻烦。
原因很简单:ads.txt 是一个很小、很关键、但又不该被“优化”的文件。它需要稳定、直接、可抓取。如果缓存机制或者安全规则偶尔把它拦住,Google 这次没拿到,就可能记录成“未找到”。
尤其是下面这些情况,最容易出问题:
- 站点刚改过规则
- CDN 节点尚未同步
- 访问来源被判定为异常
- 浏览器拿到的是缓存结果,但 Google 抓取时看到的是另一种响应
所以,ads.txt 的原则只有一个:尽量让它简单、稳定、直接返回 200。
五、最推荐的做法:给 /ads.txt 单独做一条规则
这一步非常重要。你不一定非做不可,但如果你的网站用了 Cloudflare,我真的建议你做。
规则 :绕过缓存
在 Cloudflare 里新建一条 Cache Rule,条件设置成:
URI 路径 等于 /ads.txt
然后把动作设置为:Bypass cache
这样做的目的是让 /ads.txt 尽量不受缓存影响,直接回源。
小白具体操作:
1.登录 Cloudflare,进入你这个站点。
2.去 Cache Rules 页面。Cloudflare 官方步骤就是:进 Cache Rules,点 Create rule。
3.规则名字随便填,建议写:ads.txt bypass
4.在 When incoming requests match 里选 Custom filter expression。
5.在表达式里把条件设成“路径等于 /ads.txt”。Cloudflare 官方说明这里可以用表达式构建器选择字段、运算符和值;可用运算符里就包括 equals。
6.在 Then 里找到 Cache eligibility,选 Bypass cache。官方说明这个选项的意思就是:匹配到的请求不缓存。
7.点 Deploy。Cloudflare 官方文档写的是,想保存就点 Deploy;不想立刻上线可以先 Save as Draft。
如图:

8.成功显示如图:

六、总结
最简单的判断标准:
浏览器打开 https://apepine.com/ads.txt,能直接看到文件内容。
你服务器上执行 curl -I https://,返回 apepine.com/ads.txt200 OK。
Cloudflare 里规则显示 Deployed。
如果你的 curl 还是 200,而且 /ads.txt 规则已经部署,通常就说明站点端已经稳定了。