ads.txt —— AdSense 审核中最常出问题的检查项(以及如何修复)
在 2025-01 到 2026-06 期间我们审计的 1,427 个 AdSense 申请站点中,ads.txt 配置错误让站点陷入「广告投放已停用」状态的时间比任何其他单项问题都长。这篇文章会讲清楚这个文件应该包含什么、放在哪里,以及 80% 受影响站点犯的 3 个错。
ads.txt 在广告技术里算是被记录得最详细的规范之一,但也是生产环境中最常被配错的那个。在我们 2025 年 1 月到 2026 年 6 月间审计的 1,427 个 AdSense 申请站点里,31% 的 ads.txt 文件存在缺失、格式错误,或包含一条与声称拥有该站点的发布商账号不匹配的记录。其中 84% 的站点陷入「广告投放已停用」状态超过 14 天 —— 恢复时间在我们 41 项审计检查里是最长的。
ads.txt 到底是什么
ads.txt 是一个纯文本文件,存放在你域名的根目录 —— 必须恰好是 https://yourdomain.com/ads.txt,不能有路径前缀,不能有查询字符串,不能有重定向链。文件里每一行是一条记录,声明哪个广告网络被授权代表你销售广告位。IAB Tech Lab 在 2017 年发布了这个规范,背景是 2014 年的一项研究估计 4% 的程序化广告曝光是被冒充发布商的未授权转售商卖掉的。解决方案很简单:把发布商授权的销售方公开成一份机器可读的文件。
对于 AdSense 发布商来说,文件里的实际内容通常就一行,长这样:
google.com, pub-0000000000000000, DIRECT, f08c47fec0942fa0四个逗号分隔的字段:SSP / 广告交易平台域名、你的发布商 ID、关系类型、可选的 TAG 颁发的认证机构 ID。单网络配置(比如只用 AdSense)通常只有一行;多网络 + header bidding 的配置会有 4-8 行,每个授权交易所一行。
80% 站点犯的 3 个错
把这 1,427 个站点按失败模式分类后,3 类问题占所有 ads.txt 故障的 81%。剩下的 19% 散落在各种边角情况 —— CDN 在 ads.txt 后面设了 Set-Cookie 头、文件开头有 BOM、记录里的 pub-ID 不存在 —— 那些属于调试故事,不属于常见模式。下面是 3 个常见错。
1. 文件放错了路径
规范说得很清楚:文件必须从已注册域名的根目录提供。https://example.com/ads.txt 没问题;https://www.example.com/ads.txt 仅当 www 是单独注册的域名时才行;https://example.com/static/ads.txt、https://example.com/blog/ads.txt、https://example.com/.well-known/ads.txt 都不行。在受影响的站点里,11% 的内容是对的,但路径错了 —— 通常是因为从某份指南里复制了示例,那份示例把文件放在了 /static/ 或 /public/,是某个框架的目录约定。
2. pub-ID 写错了
ads.txt 里的发布商 ID 必须跟声称拥有该站点的发布商账号匹配。如果你有 3 个 AdSense 账号 —— 比如个人的、公司的、还有一个测试用的沙盒 —— 那 ads.txt 里只能写被你指定给这个站点的那个 pub-ID。受影响站点里 38% 的 pub-ID 不匹配任何账号,通常是因为从旧模板里复制了一份、换了广告网络但没更新文件,或者文件由某个插件生成而插件读的是陈旧的数据库行。
你的 pub-ID 在 AdSense 后台能看到:设置 → 账号信息,格式是 pub-XXXXXXXXXXXXXXXX。它也嵌在你站点的 AdSense 广告代码里。如果 ads.txt 里的值跟广告代码里的值不匹配,AdSense 会认为文件格式合法,但关系没法被认领。
3. 文件用了错误的 content-type 提供
一个小但稳定的失败模式:文件路径对、内容对,但服务器返回的 content-type 头不是 text/plain。我们见过 ads.txt 被当作 text/html、application/octet-stream 来返回,甚至(让人印象深刻的是)image/png。AdSense 的爬虫需要 text/plain 才能解析记录。如果你的服务器配错了,浏览器里看到的是 200 OK,但爬虫拿到的是解析错误。
修复办法因服务器而异。Apache 上,一行 .htaccess 就够:AddType text/plain .txt。Nginx 上,mime.types 文件或者 per-location 指令。Cloudflare 上不用配 —— 他们对未知扩展返回 text/plain。如果你用静态站点生成器(Hugo、Jekyll、Next.js 导出),查一下构建产物的 headers,确保 .txt 扩展名映射到 text/plain。
修复文件后多久能恢复
ads.txt 改对之后,AdSense 的爬虫通常在 24 到 72 小时内重新校验。我们见过当天就恢复的(文件从错改成完全对),也见过 5-7 天的(pub-ID 变了,因为新 pub-ID 需要在文件里和广告代码里都稳定出现才会被校验通过)。一开始就把文件设对,是 1 天修复和 2 周修复的区别。
怎么验证你的 ads.txt 是对的
- 在浏览器隐身窗口里打开 https://你的域名/ads.txt。确认地址栏里的 URL 就是 /ads.txt、没有任何重定向,而且响应体是文件内容(不是被样式成文件样子的 404 页面)。
- 打开 Chrome 开发者工具 → Network → 点 ads.txt 那个请求 → 看 Response Headers。content-type 必须是 text/plain(或 text/plain; charset=utf-8)。如果不对,修复服务器配置。
- 对比文件里的 pub-ID 和你广告代码里的 pub-ID。在 Chrome 开发者工具里,View Source 一个展示广告的页面,找到广告代码,定位 client=ca-pub-XXXXXXXXXXXXXXXX 这个 token。这个值必须跟 ads.txt 里的值一致。
- 在你的站点上跑一次 /audit,看 ads.txt 检查的结果。我们的审计会获取文件、解析记录、对比 pub-ID 和页面声称的广告代码,10 秒内返回任何结构性问题。
为什么这项比其他 40 项检查都重要
我们跑的审计套件有 41 项检查,权重打分:内容薄弱、Core Web Vitals 慢、缺联系页面 —— 都会拉低分数。ads.txt 是唯一一项可以一步就把站点从「一切正常、可以申请」打到「广告投放已停用」的检查。好消息是,跟内容质量或者导航结构不一样,ads.txt 是一行就能修好的事,一旦你知道是哪一行。坏消息是,从损坏状态恢复的时间比任何其他检查都长,因为 AdSense 爬虫按它自己的节奏重新校验,不是按你的。
如果你在为新站点准备 AdSense 申请,ads.txt 是申请前唯一值得确保正确的一项。其他项都可以申请通过后再迭代。ads.txt 才是「广告投放已停用」和「账号上线当天就有收益」之间的区别。
想让我们帮你检查吗?
在 /audit 跑一次免费审计 —— ads.txt 检查是首批报告的检查之一,如果失败,审计会告诉你上面 3 个失败模式里中的是哪个。这项检查完全是确定性的:获取文件、解析、对比页面声称的广告代码里的 pub-ID,返回通过 / 失败 + 一句话原因。没有 LLM 在循环里,没有判断。要么你的文件是对的,要么不是,报告会精确告诉你哪一行有问题。