1. 先搞懂 llms.txt 到底是什么,以及它在解决什么问题
如果你最近在关注 AI 搜索、大模型抓取或者网站内容被 AI 引用这件事,大概率会刷到 llms.txt 这个词。这个标题的表述很直白,就是“没人抓取我的 llms.txt”,说白了,你的网站已经按照规范写好了 llms.txt 文件,也放在了根目录,但 AI 搜索爬虫或者说大模型的内容抓取流程,根本没有读取它。这个现象看起来简单,背后涉及的内容抓取机制、格式规范、爬虫白名单、内容发现路径,比你想象中要复杂不少。
我先把结论放在前面:llms.txt 是一个希望让大模型、AI 搜索工具、RAG 应用更好地理解网站结构的文本文件规范。它的核心思路,是在网站根目录下放一个结构化的 Markdown 链接文件,告诉 AI 你的网站里哪些页面最重要、哪些内容是核心、哪些页面不需要被抓取。它本身不是爬虫协议,也不是搜索引擎排名规则,更不是官方强制标准,而是一种社区推动、逐步被不同工具采纳的内容描述规范。
为什么需要它?因为传统爬虫看的是 robots.txt 和 sitemap.xml,这些东西主要告诉爬虫“哪里能访问、哪里不能访问、页面长什么样”。但对大模型来说,它们不关心页面渲染效果,它们更关心页面里有多少高质量的文本、关键信息是否集中、页面之间的关系是否清晰。你想想,一个网页可能有一半是导航栏、广告位、推荐阅读和弹窗,真正有价值的正文就几百字。llms.txt 就是想把这些噪音过滤掉,直接把最核心的内容结构和链接交给 AI 系统。
所以,如果你写了 llms.txt 却没人抓取,先别急着怪工具,大概率是你的文件没有满足别人“发现它”和“理解它”的前提条件。本文就把这个问题拆开讲,从文件规范、机器人文件配置、爬虫抓取逻辑、内容质量、测试方法这些角度,把整个链路梳理清楚。无论你是个人站长、内容创作者,还是做搜索优化、AI 应用开发的人,这篇文章都能帮你定位问题出在哪一环。
2. 为什么“放在根目录”还不够,发现机制远比你想的复杂
很多人最大的误解,就是把 llms.txt 当成 sitemap.xml 或者 robots.txt 的同类。实际上,它和这些传统文件在“被发现”的方式上完全不同。
2.1 爬虫是怎么发现你的 llms.txt 的
传统搜索引擎爬虫,比如 Googlebot、Bingbot,它们有一套成熟的调度系统,会按照固定策略访问网站。先看 robots.txt,再爬首页,再沿着链接往下走,也会主动读取 sitemap.xml 来了解网站结构。这套逻辑已经运行了二十多年,非常稳定。
但 llms.txt 目前的“发现机制”还远远没有统一。有的 AI 搜索工具会主动请求https://你的域名/llms.txt,有的根本不会,有的只会把它当作众多可抓取文件之一,并不会特殊优先处理,还有一些工具,必须先在后台提交你的域名或者网站地址,之后才会去尝试读取。
这就是问题所在:你以为“放在根目录就会被发现”,但实际上,很多 AI 爬虫根本没有内置“先请求 llms.txt 再抓取页面”的逻辑。它们的流程更像这样:
- 从某个种子 URL 开始抓取。
- 抓取首页 HTML。
- 从 HTML 里提取链接,继续抓取。
- 碰到带有 Markdown 格式的链接或者总结性文档,才可能进一步处理。
- 有些爬虫会在抓取完核心页面之后,才尝试获取 llms.txt。
换句话说,你的文件在那里,但爬虫的“眼睛”可能就没往那个方向看。
这个问题在博客里有个很典型的比喻:你把一封信放在自家门前的邮箱里,但邮递员根本没有你这个地址的投递记录,他连邮箱都不会看一眼。你要做的,不是把信再写一遍,而是让邮递员知道这个地址值得跑一趟。
2.2 llms.txt 不是 robots.txt,也不是 sitemap.xml
很多站长会混淆这几个文件的作用,我用一个表格来对比:
| 文件 | 主要作用 | 是否影响抓取边界 | 是否影响内容优先级 | 当前爬虫支持程度 |
|---|---|---|---|---|
| robots.txt | 告诉爬虫哪些路径不能访问 | 是 | 否 | 几乎所有爬虫都会读取 |
| sitemap.xml | 告诉搜索引擎你的网站有哪些 URL | 否,更多是建议 | 否 | 主流搜索引擎支持 |
| llms.txt | 给大模型提供网站内容结构和推荐链接 | 否,它更像内容摘要与链接索引 | 是,可以控制优先级和分类 | 只有部分 AI 爬虫支持 |
搞清楚这个区别,你才知道自己卡在哪一步。如果你的 llms.txt 一直没被抓取,你要确认的,不是“文件内容写得好不好”,而是“对方从哪个入口才能感知到你的文件”。
我再补充一个容易踩的坑:有些工具会同时读取 robots.txt 和 llms.txt,如果你在 robots.txt 里屏蔽了某个 AI 爬虫,那它自然也不会去读你的 llms.txt。这两者不是替代关系,而是递进关系。先用 robots.txt 决定“能不能来”,再用 llms.txt 决定“来了以后看什么、优先看什么”。
3. 从零写好一份合格可用的 llms.txt,别再以为 Markdown 就行
先讲一个基础事实:llms.txt 有官方推荐的格式草案,但它本质上就是一个文本文件,后缀名是.txt,放在网站根目录下。它内部使用 Markdown 语法,推荐结构包含几个部分:文件说明、H1 标题、网站简介段落、区块标题、链接列表、可选的文件列表。
很多人以为随便写几个链接就是 llms.txt,结果文件里既没有说明,也没有分类,更没有正文区的索引,爬虫抓到以后无法判断页面优先级,自然也不会优先处理。
3.1 一份基础可用的 llms.txt 长什么样
我建议你先看一个最简结构,再逐步扩展:
# 网站名称 > 一段简洁的网站介绍,说明这个网站是做什么的,适合 AI 系统快速了解站点内容。 ## 核心页面 - [首页](https://example.com/) - [关于我们](https://example.com/about) - [产品介绍](https://example.com/products) ## 文档与教程 - [快速开始](https://example.com/docs/quickstart) - [API 参考](https://example.com/docs/api) ## 博客文章 - [2025 年技术趋势总结](https://example.com/blog/trends-2025) - [如何配置本地开发环境](https://example.com/blog/dev-env-setup)这个结构看起来简单,但它已经包含了几层信息:
- 站点级摘要,让 AI 知道网站是做什么的。
- 分类区块,告诉 AI 网站内容分哪几块。
- 链接列表,优先级由最前面的链接决定。
- 区块标题,方便 AI 按主题抓取。
如果你把网站几十个页面全部塞进去,而不是分层分类,那 AI 系统会很难判断哪些才是真正的核心页面。这也是爬虫不抓取、不重视文件的常见原因之一:你的文件本身没有提供足够清晰的导航价值。
3.2 文件里不要出现什么内容
这里我提醒几个常见错误,很多人就是栽在这些细节上:
- 不要放 robots.txt 的 meta 标签、不要放 HTML 标签、不要放 JavaScript 代码。这是纯文本 Markdown,不是网页。
- 不要塞入重复链接,不要为了凑数量把同一个页面的不同 URL 都放进去。
- 不要把动态 URL 和带参数链接当成核心页面,比如
?id=123这种,爬虫很少优先抓取。 - 不要忽略链接锚文本,锚文本就是链接显示出来的文字,最好是描述性文字,不要写“点击这里”。
- 不要把全部内容都放在一个层级里,至少要有分类层级。
这里再加一个容易被忽略的问题:文件编码。llms.txt 建议使用 UTF-8 编码,不要用 GBK 或者带 BOM 的 UTF-8。某些爬虫解析器对编码很敏感,一旦遇到乱码,整个文件都可能被丢弃。
我自己测试过的一个例子:第一次写 llms.txt 时,内容全对,但文件是从 Windows 记事本保存的,自动带了 BOM 头,有些解析器会把这个符号当成内容的一部分,后续链接解析就错位了。后来换成无 BOM 的 UTF-8,问题马上消失。
所以在发布之前,用 VSCode 或者命令行检查一下文件编码,这是最便宜、最有效的排查手段。
4. 写入 robots.txt 和 sitemap 只是基础操作,关键在于“给谁看”
4.1 当前主流 AI 爬虫与 llms.txt 的支持情况
你可能会问,现在到底有哪些爬虫会读取 llms.txt?这里我只能说一个大概范围,因为工具迭代太快,而且不同团队对 llms.txt 的重视程度不一样。
从公开信息和社区反馈来看,以下几类工具会尝试读取:
- 部分 AI 搜索工具,比如一些以答案生成、信息聚合为核心的产品。
- 部分大模型训练数据抓取流程,会在内部抓取阶段试探根目录文件。
- 部分 RAG 类应用,尤其是个人开发的、基于知识库的应用,会把 llms.txt 作为首选入口。
- 一些开源爬虫框架,可能内置了支持 llms.txt 的抓取逻辑。
反过来说,也有不少工具根本不关心这个文件。常见的 AI 爬虫,比如 GPTBot、ClaudeBot、PerplexityBot、Google-Extended 等,它们的标准抓取流程是读取 robots.txt,再直接抓取页面 HTML,并不会因为根目录存在 llms.txt 就改变路径。
那 llms.txt 到底有什么用?它的价值更多体现在:当某个 AI 系统真的想理解你的网站时,这个文件可以大幅提高抓取效率和质量。它不是万能的,但它是一个准确且廉价的内容结构和推荐索引。
4.2 如何在 robots.txt 中正确处理这些爬虫
这里有一个很关键的实操点:你如果想要某些 AI 爬虫读取你的网站,并进一步读取 llms.txt,那 robots.txt 不能被一刀切屏蔽。
很多人的 robots.txt 是沿用别人的模板,结果里面写了:
User-agent: * Disallow: /或者更夸张:
User-agent: * Disallow: /wp-admin/这种写法,对某些 AI 爬虫来说,就等于整个网站都不给访问。这时候别说 llms.txt,连首页都不会被抓取。
更合理的做法,是在 robots.txt 里允许 AI 爬虫访问网站根目录和核心内容路径,同时对不必要的目录做精细控制:
User-agent: GPTBot Allow: / Disallow: /private/ User-agent: ClaudeBot Allow: / Disallow: /private/ User-agent: PerplexityBot Allow: / Disallow: /private/ User-agent: * Allow: / Disallow: /private/同时,还要在 sitemap.xml 当前已有的链接基础上,把 llms.txt 对应的链接关系通过网站首页和核心页面暴露出来,而不是指望爬虫直接猜根目录文件名。比如,在首页的 HTML 中加一个指向 llms.txt 的<link>标签,或者在页面正文中给出该文件链接,都能提高被发现的概率。
<link rel="alternate" type="text/markdown" href="https://example.com/llms.txt">这个操作很简单,但很多人没做。它的原理是:爬虫从首页 HTML 里发现这个链接后,有可能把它当作一个可抓取的页面,存到待抓取队列里。尤其是一些通用爬虫,不会专门猜测 llms.txt,但它会老老实实跟随页面里的链接。
4.3 为什么 sitemap.xml 也要更新
sitemap.xml 是给搜索引擎爬虫看的,但它同样可能被部分 AI 工具读取。如果 sitemap 里没有包含核心页面,那 AI 爬虫只能通过 HTML 链接慢慢爬,发现速度会慢很多。
建议在生成 sitemap 时,确保核心内容页面都在其中,并且页面之间有清晰的内部链接关系。如果你的 llms.txt 中列出的页面和 sitemap 中的页面不一致,会对爬虫造成困扰——它会想,到底哪个才是网站的核心内容?
5. 排除检查链路:为什么你的 llms.txt 可能“没被抓取”
5.1 先看日志,再下结论
很多人说“没被抓取”,但实际根本没查过服务器访问日志。我自己遇到过一个案例,用户说 llms.txt 没人读取,结果一查服务器日志,发现 ClaudeBot 每天访问了好几次,只是用户一直在看流量统计里有没有明显标注,没注意这个爬虫的请求记录。
所以第一步,不要凭感觉,先看 Nginx 或者 Apache 的访问日志,搜索这些关键词:
grep "llms.txt" /var/log/nginx/access.log grep "GPTBot" /var/log/nginx/access.log grep "ClaudeBot" /var/log/nginx/access.log如果日志里完全没有任何记录,说明爬虫根本没找到你的文件链接,或者根本没有访问你的网站。如果日志里有记录,但返回 404,那就是文件路径或者权限问题。如果返回 200,说明文件其实已经被下载过,只是后续没有被解析或使用。
这段日志分析非常关键,能帮你直接判断问题停留在哪一层。
5.2 检查文件是否真的能公开访问
这里建议用浏览器无痕模式或者 curl 命令测试:
curl -I https://example.com/llms.txt正常响应应该是 200,并且返回Content-Type: text/plain。如果你看到 403、404、301 跳转,那就说明文件并没有被正常暴露。
301 跳转也要注意:如果你的网站强制 http 跳 https,或者加了 www 跳转,那 llms.txt 的最终地址可能和你配置的不一致。建议请求最终的 https 地址,并且保持站内所有的 llms.txt 链接为同一个最终 URL。
5.3 检查文件是否被 robots.txt 拦截
即使你的 llms.txt 文件本身可以访问,如果 robots.txt 里对应爬虫的规则不允许访问根目录,爬虫就不会去抓取。
这类问题排查步骤:
- 打开你的 robots.txt,看看有哪些
User-agent规则。 - 用
curl -A "GPTBot" https://example.com/robots.txt模拟 AI 爬虫访问。 - 确认 Allow 和 Disallow 的优先级是否按预期生效。
在 robots.txt 的标准里,最具体的匹配规则优先级更高,但不同爬虫可能有自己的实现差异。最稳妥的做法,是直接允许根目录和内容目录访问,不要用过于复杂的规则,避免误伤。
5.4 检查 CDN 缓存和 WAF 规则
如果你使用了 Cloudflare、阿里云 CDN 之类的服务,问题可能出在中间层。比如,CDN 对 txt 文件的缓存时间太长,导致你明明更新了内容,爬虫看到的还是旧版本。或者 WAF 防火墙规则把你的文件请求当作异常流量拦截了。
这类情况很难在本地复现,因为直接请求源站 IP 可能没问题,但通过 CDN 访问就异常。建议在测试时,既测试域名访问,也测试源站直连,对比一下结果。
5.5 检查 HTML 内容入口
这个点最容易忽略。你可以问自己一个问题:AI 爬虫从你的首页出发,能否在有限的跳数内找到 llms.txt?
很多网站的首页,是一个纯运营落地页,没有任何内容链接,也没有指向 llms.txt 的入口。那爬虫抓完首页以后,发现既没有链接线索,也没有 sitemap 引导,它就跳到下一个 URL 去了。你的 llms.txt 即使写得再好,也相当于放在一个没有门牌号的地方。
解决办法很直接:在网站首页的<head>或<footer>区域加入 llms.txt 的链接,至少让爬虫有一次机会看到它。
5.6 检查 llms.txt 内容是否被解析器接受
有时候,文件可以被下载,但内容结构不符合解析器预期,导致解析器把它当成普通文件丢在一边。比如:
- 标题层级混乱,解析器无法识别主标题。
- 链接格式错误,比如使用了 HTTP 而不是 HTTPS。
- 文件过短,只有一两个链接,没有给 AI 足够的导航价值。
- 文件过大,塞入了成百上千个链接,解析超时或被截断。
判断标准很简单:如果你的 llms.txt 不能让自己在五分钟内理解网站结构并且知道优先级,那它对 AI 来说也差不多。
6. 优化 llms.txt 的实用技巧:让 AI 更愿意使用它
6.1 用“摘要式简介”代替口号式文案
很多人的 llms.txt 开头是“欢迎来到我的网站,这是一个优秀的博客”,这种描述对 AI 来说没有信息量。
更好的写法:
# 我的技术博客 > 面向后端开发者的技术博客,内容涵盖 Go、Docker、Kubernetes 和云原生架构,提供可运行的示例代码和部署实践。这段简介直接告诉 AI:网站是谁给谁看的、提供什么类型的干货、读者可以从这里获得什么。LLM 解析时,这段描述很容易被提取为网站的核心标签。
6.2 把最重要的内容放在最前面
这个文件不同于普通页面,阅读者很可能是一个自动化系统,它不一定会完整读完。前三个区块,应该放你真正希望被 AI 引用的核心内容,比如产品文档、API 参考、核心教程、高质量长文。不要把自己觉得“意义重大”但实际没人看的页面放前面。
前面放“关于我们”“公司介绍”这种页面,对 AI 的吸引力不大,因为它并不能帮助 AI 回答用户问题。核心页面放前面,会直接提升这些页面的被引用概率。
6.3 按照用途分区,而不是按发布时间
常见的 llms.txt 分区思路:
- 产品文档区
- API 参考区
- 博客文章区
- 开源项目区
- FAQ 区
分区的核心逻辑,是让用户和 AI 都能快速定位内容。如果你只是按年份把文章堆在一起,这个文件的导航价值就大打折扣。
6.4 保持文件更新频率合理
如果你的网站每周都发新内容,llms.txt 也建议每周或每两周更新一次。不要写完之后就再也不管。AI 系统抓取时,可能会比较文件的最后修改时间。长期不更新的 llms.txt,在爬虫眼中的优先级会逐步降低。
你可以写一个小脚本,在发布文章后自动更新 llms.txt,把最新文章追加到对应分类。这样能保证文件始终反映网站当前状态,而不是一个过期快照。
7. 不同部署环境下的 llms.txt 配置参考
7.1 静态站点
如果你用的是 Hugo、VitePress、Astro、Hexo 这类静态站点生成器,最简单的方式是把 llms.txt 放在static或public目录,发布后会自动出现在网站根目录。
注意一点:如果你的站点有 basePath,比如部署在 GitHub Pages 的子目录下,那么 llms.txt 的实际 URL 会变成https://用户名.github.io/项目名/llms.txt。这仍然是根路径,只不过“根”是子路径的根。这种情况要在 sitemap 和首页链接里都使用这个完整路径。
7.2 Nginx 服务
在 Nginx 中,你只需要确保根目录配置正确:
server { listen 80; server_name example.com; root /var/www/example.com; location = /llms.txt { default_type text/plain; } }之所以专门加一个location,是为了确保Content-Type是text/plain,而不是被默认解析成application/octet-stream。
7.3 WordPress 网站
如果你用 WordPress,不需要修改主题源码,直接使用 FTP 或者文件管理器,把 llms.txt 上传到网站根目录即可。每次更新时,如果不想手动改,可以写一个简单的 PHP 页面模板,但通常情况下直接传文件就够了。
需要注意,WordPress 的固定链接规则可能会影响静态文件访问,但根目录下的.txt文件一般不会受影响,因为它不是通过 WordPress 路由处理的。
7.4 存在鉴权或内网环境
如果你的网站需要登录才能访问,那么 llms.txt 也必须允许匿名访问。否则,AI 爬虫会收到登录跳转页面,而不是文本内容。这类场景下,如果确实要开放内容给 AI,需要通过中间层生成一份公开版本的 llms.txt,而不是直接暴露内网文件。
8. 实测建议:先做最小闭环验证,再谈扩大曝光
8.1 不急着“每个 AI 工具都提交”,先把内容抓取路径通起来
很多人一股脑地往各种 AI 搜索平台提交站点,结果文件问题没解决,提交再多也没用。我建议按这个顺序走:
- 本地验证文件结构:用浏览器打开 llms.txt,确认渲染正常,链接可点击。
- 命令行验证响应:用 curl 抓取,确认状态码、Content-Type、内容长度。
- 验证 robots.txt 放行:模拟主流 AI 爬虫的 User-Agent,确认可以访问。
- 验证首页入口:通过无痕模式查看首页源码,确认 llms.txt 的链接存在。
- 等几天再看日志:观察日志中是否有 llms.txt 的请求记录,对比提交前后变化。
- 用第三方工具测试:有些工具会提供 AI 可读性检测,可以用它检查文件解析结果,但要注意结果仅供参考,不同工具判断标准不一样。
8.2 如果依然没有人抓取,怎么办
如果上面六步全部通过,但还是没有看到实际抓取记录,那就接受一个现实:你控制的只是你网站自己的文件和配置,你控制不了别人的爬虫策略。
这种情况下,可以尝试:
- 持续更新 llms.txt,让它保持活跃。
- 把 llms.txt 的链接放在更多公开页面里,比如首页、关于页、Sitemap 页面。
- 看博客或者社区里关于具体 AI 搜索工具的支持说明,确认它们是否公开支持 llms.txt。
- 多关注那些使用开源爬虫框架的 AI 应用,它们采用新规范的速度通常更快。
- 保持标准、简洁、稳定的输出。今天的 llms.txt 可能不被某几个大型工具认可,但未来这个格式一旦被更多工具采纳,你的文件已经准备好了,这本身就是一种优势。
9. 常见误区与边界认知
9.1 llms.txt 不是搜索结果排名工具
很多人把 llms.txt 当成 SEO 工具,指望写完之后 AI 搜索排名提升。但 llms.txt 的作用是“给 AI 理解网站的入口和结构”,不是“告诉 AI 必须回答你的内容”。即使 AI 抓取了 llms.txt,也不代表它一定会引用你。最终的答案来自模型对多个来源的综合判断。
9.2 llms.txt 不是网站所有权的证明
有观点认为“网站有 llms.txt 就代表站主愿意被 AI 抓取”,但这只是社区层面的共识,不是法律依据。不同平台有自己的判断标准。目前更常见的做法,仍然是通过 robots.txt 来声明抓取边界。
9.3 llms.txt 更新频率不等于抓取频率
文件更新后,爬虫不一定马上重新抓取。它有自己的周期和调度策略,可能是一周一次,也可能是一个月一次。所以,不要因为当天改完没看到抓取日志,就断定文件有问题。
9.4 “支持 llms.txt”不等于“必须使用 llms.txt”
不少 AI 工具会在官网说支持 llms.txt,意思是它们的爬虫会尝试请求这个文件。但如果请求失败、内容为空、解析异常,它们会直接回退到普通 HTML 抓取流程。所以,即使你的 llms.txt 没被抓取,AI 依然可能通过其他页面抓取你的网站,只是抓取效率可能没那么高。
10. 从“没人抓取”到“稳定被读取”,最值得盯住的三件事
写到这里,我把自己踩过的坑和排查经验再浓缩一下。第一,先确认文件本身真的是可访问、可解析的,不要用猜测代替日志验证。第二,保证 robots.txt、sitemap、首页链接在 llms.txt 这个路径上形成闭环,让爬虫至少有一个自然的入口发现文件。第三,不要指望 llms.txt 单独完成所有曝光工作,它只是帮助 AI 理解网站的众多机制之一。
一个成熟的做法,是把 llms.txt 和 robots.txt、sitemap.xml、页面结构化数据当成一套组合策略,而不是各管各的文件。先让 AI 爬虫能进来,再让它看清内容结构,最后才轮得到“内容被引用”这件事。
返回最开始的问题:Nobody Fetched My Llms.txt。大多数情况下,不是因为你的内容糟糕,而是因为你的文件缺少被发现路径,或者网站整体的抓取配置存在断点。把这些断点补上,再给爬虫一点时间,结果会比你现在看到的更接近预期。