llms.txt无人抓取?AI爬虫与站点内容发现全排查指南

发布时间:2026/8/30 17:02:56
llms.txt无人抓取?AI爬虫与站点内容发现全排查指南 开发网站的朋友应该都体验过这样的场景你认真写好了一份llms.txt放在服务器根目录也在本地用浏览器验证过可以正常访问结果几个星期之后去翻访问日志发现llms.txt的请求次数依然是 0。第一反应可能是“我做错什么了”第二反应则是“这个文件到底有什么用”。这篇文章就围绕“Nobody Fetched My Llms.txt”这个问题展开先讲清楚llms.txt是什么、它的定位和工作方式再一步步排查为什么没有爬虫来读取它最后给出可落地的优化建议和最佳实践。如果你正在给站点配置llms.txt或者已经配置完成但看不到任何抓取记录这篇内容应该能帮你少走弯路。文章里会包含文件格式、部署验证、常见错误、抓取排查和工程建议代码和命令都可以直接复制参考。1. llms.txt 到底是什么1.1 从“给人类看的首页”到“给 AI 看的首页”每个网站都有一个首页人类的浏览器打开首页后可以顺着导航、文章列表和详情页一层层浏览。但大语言模型LLM的爬虫在访问网站时并不像人一样能轻松理解复杂的页面结构。JavaScript 渲染的内容、弹窗、广告、移动端隐藏区块都会干扰 AI 对站点核心内容的理解。llms.txt的出现就是想让网站提供一个简化、纯文本、集中的“给 AI 看的入口页”。它通常放在网站根目录下例如https://example.com/llms.txt里面用 Markdown 短句描述站点定位并列出最重要的内容链接。这样AI 爬虫不需要解析大量 HTML就能快速判断“这个站点有什么、哪些页面值得读”。可以把它理解为robots.txt告诉搜索引擎“哪些能爬哪些不能爬”。sitemap.xml告诉搜索引擎“你有哪些 URL 需要收录”。llms.txt告诉大模型“我的网站核心内容是什么从哪里开始阅读”。这二者并不是竞争关系而是互补关系。llms.txt更强调内容的组织与可读性而不是抓取规则。1.2 llms.txt 解决的是“发现效率”问题大模型厂商训练模型或做联网检索时不可能把整张互联网无差别爬完。它们更倾向于先收集高价值文本再通过检索增强生成RAG等方式把网页内容作为知识来源。如果站点信息散落在几十个页面里AI 爬虫需要层层跳转还要过滤导航、推荐、评论等噪声。llms.txt则把最核心的介绍和链接集中在一个纯文本文件里显著降低了 AI 理解站点的成本。因此llms.txt的核心价值不是“被所有人看见”而是“让愿意查看的 AI 爬虫用最低成本理解你”。1.3 为什么有人配置了却无人读取llms.txt属于新生事物虽然有越来越多的模型厂商和研究项目在关注但它还不是像robots.txt那样默认必须读取的标准。很多爬虫没有强制读取这个文件搜索引擎的索引系统也没有把它列入核心排名因素。也就是说你配置了llms.txt只是准备好了一份“给 AI 看的简历”但并没有一个中央机构会自动来抓取它。所以“Nobody Fetched My Llms.txt”并不一定意味着你配置错误。在进入排查之前我们需要先确认自己的技术实现是否符合规范再判断是不是“等待窗口”还没结束。2. 环境准备与前置条件2.1 你需要准备什么要配置和排查llms.txt建议先准备好以下环境一个已经正常访问的域名或站点例如https://example.com。能够修改站点根目录文件的权限比如通过 FTP、服务器文件管理器或 DevOps 流水线。一个可以请求公网域名的终端环境用于curl验证。如果在 Nginx 或 CDN 前面需要了解对应的响应头、重定向和缓存策略。版本方面llms.txt本身不依赖特定操作系统或编程语言。无论站点是静态页面、WordPress、Next.js、Vue 还是 Nginx 静态目录只要能在根目录输出一个名为llms.txt的纯文本文件即可。不同框架的示例可能略有差异你可以根据自己的项目结构调整。2.2 规范仍在演进需要特别说明的是llms.txt的格式约定还处于早期阶段不同厂商和工具的解释并不完全一致。目前社区主流建议是使用一个 UTF-8 编码、以 Markdown 链接列表为主的纯文本文件。但未来可能会有更多头部模型厂商定义自己的扩展字段。因此本文给出的格式是“当前主流建议”不保证能适配每一家爬虫但可以保证是兼容性较高的通用写法。在动手之前先做一个最基础的开源思路让文件尽量简单少放复杂的 HTML 标签或自定义 JSON 结构。爬虫需要的不是花样而是稳定的文本内容。3. 创建一个规范的 llms.txt3.1 最小可用文件一个最简llms.txt文件可以只包含三部分第一行一级标题。第二行一段引用简介。后续行按 Markdown 格式列出的重要链接。下面是一个文本示例# Example Site Example Site 是一个提供 Python 后端教程和开源工具的中文技术站点内容覆盖 FastAPI、Django、数据库设计和项目部署。 - [Python 后端教程](https://example.com/python): 从环境搭建到项目上线的完整教程 - [FastAPI 实战](https://example.com/fastapi): 使用 FastAPI 构建 REST API - [开源项目](https://github.com/example/example-project): 后端脚手架与部署脚本这里需要注意的是llms.txt并不是完整的 Markdown 文档而是“摘要 精选链接”的组合。链接数量不要贪多建议保留 10 到 20 个最重要的入口。如果链接太多反而失去了“快速理解”的意义。3.2 使用纯文本而不是 HTML很多开发者会下意识地写成 HTML 文件比如html body h1Example Site/h1 a hrefhttps://example.comExample/a /body /html这种写法对人和浏览器都很常见但llms.txt的核心命名和访问方式要求它是文本文件。虽然某些爬虫可能也能从 HTML 中提取内容但最好严格按照纯文本格式输出。MIME 类型建议设置为text/plain字符集建议显式为UTF-8。如果你担心格式不被理解可以把链接末尾的说明文字写成一句完整的话。这样即使爬虫不解析 Markdown也能从纯文本中读到关键信息。3.3 文件的存放位置文件名必须叫llms.txt全部小写不要写成LLMS.txt或Llms.Txt。服务器是否区分大小写取决于操作系统但为了避免不必要的麻烦一律使用小写。文件应该放在域名根目录也就是https://example.com/llms.txt而不是https://example.com/content/llms.txt https://example.com/static/llms.txt虽然某些爬虫可能会递归发现子路径下的文件但官方倡议和大多数文档默认读取根目录地址。放在根目录是最保守、兼容性最高的做法。3.4 是否需要生成动态内容如果你的站点本身就是动态站点可以把llms.txt做成动态接口但要注意响应头和缓存。比如 Nginx 配置中可以直接映射到本地文件也可以由后端返回字符串。只要最终响应是纯文本并且根路径可访问就行。动态生成的好处是能自动更新链接和简介坏处是需要额外保证性能与稳定性。对于个人博客静态文件通常已经够用。4. 部署与本地验证4.1 部署到服务器以最常见的 Nginx 静态站点为例如果你把llms.txt文件放在/var/www/example.com/llms.txtNginx 默认会根据文件扩展名返回text/plain或application/octet-stream。为了保险可以显式加上一层配置server { listen 80; server_name example.com; root /var/www/example.com; index index.html; location /llms.txt { default_type text/plain; charsetutf-8; add_header Cache-Control no-cache; } }配置完成后重新加载 Nginxsudo nginx -t sudo systemctl reload nginx这段配置的作用是当请求/llms.txt时明确返回text/plain和 UTF-8 字符集同时关闭缓存方便后续更新内容时能快速被新的爬虫请求读取到。4.2 用 curl 模拟抓取部署完成后使用curl模拟爬虫的请求检查返回内容curl -i https://example.com/llms.txt期望输出类似下面这样HTTP/2 200 content-type: text/plain; charsetutf-8 cache-control: no-cache # Example Site Example Site 是一个提供 Python 后端教程和开源工具的中文技术站点...重点看两个地方状态码是否是200响应头中content-type是否是text/plain或我们配置的值。如果看到301或302说明请求可能被重定向到了首页或其他位置需要进一步处理重定向规则。如果你启用了 CDN还需要检查 CDN 节点上是否存在缓存版本。可在请求头中加一个随机查询参数来测试不过这里不建议在公开 URL 上随意加参数因为爬虫不会自动加上。你可以在 CDN 控制台中进行缓存刷新确认源站的响应正确。4.3 检查 robots.txt 是否允许读取robots.txt可能会影响某些遵循协议的爬虫。虽然没有统一标准说“必须先看 robots.txt”但如果你的robots.txt禁止了所有爬虫那么一些 LLM 爬虫也可能遵守这个限制。可以在robots.txt中为常见 AI 爬虫添加规则例如User-agent: * Allow: /更保守一点你不希望其他爬虫进入后台但希望 LLM 爬虫读取llms.txt可以用类似下面这种方式User-agent: * Disallow: /admin/ Allow: /llms.txt这是一种兜底策略具体爬虫是否遵守要看它们的实现。需要注意的是不要因为担心抓取不足就把robots.txt全部删掉这可能会带来更大的安全和合规风险。4.4 使用浏览器无痕窗口访问除了命令行还可以用浏览器无痕窗口直接访问https://example.com/llms.txt。正常情况下浏览器会直接显示文本内容而不是触发下载。如果浏览器提示下载说明 Content-Type 可能被配置成了application/octet-stream这会降低部分爬虫的读取意愿需要按上面的 Nginx 配置修改。到这里文件已经部署成功。但“部署成功”和“被爬虫访问”之间还有很长一段距离。接下来我们重点排查“为什么没有被抓取”。5. 排查为什么 Nobody Fetched My Llms.txt5.1 检查访问日志与 CDN 日志先说一个容易误判的情况你看着 CDN 控制台里的统计没有llms.txt请求于是以为“没人抓取”但可能 CDN 把静态文件缓存了后续请求全部命中节点不会每次回源。因此第一件事是同时查看源站访问日志、CDN 访问日志和 CDN 命中率。如果本地日志格式默认包含请求路径可以临时用命令快速过滤grep llms.txt /var/log/nginx/access.log | tail -20如果暂时没有请求先不要慌。llms.txt不是搜索引擎的“收录提交接口”它不会像sitemap.xml提交后立刻被 PING 抓取。它的传播依赖的是爬虫主动发现和尝试读取。5.2 常见原因清单下面这张表列出了“配置了 llms.txt 却没被读取”的高频原因问题现象常见原因解决思路日志完全没有请求爬虫还没发现这个文件名在首页加入链接通过 sitemap 暴露等待更长时间请求出现 404文件路径不对或大小写错误检查根目录llms.txt是否存在确保小写请求返回 301/302站点强制跳转 HTTPS 或新增尾斜杠检查重定向规则保持/llms.txt最终可访问请求返回 200 但内容为空文件编码或服务器配置异常用 curl 检查响应体确认非空爬虫请求被防火墙拦截WAF 规则误判纯文本请求查看安全日志添加白名单或调整规则所有请求都命中 CDN 缓存源站没有回源日志里看不到刷新 CDN 缓存或对比 CDN 日志爬虫遵守 robots.txt 且被禁止规则过于严格允许爬虫访问根目录和/llms.txt文件内容过于简略爬虫认为不值得读取丰富内容增加高质量说明文字5.3 你的站点的“外链曝光度”不足再想一个细节爬虫不会主动在全网搜索“谁的根目录有 llms.txt”除非它们已经在访问你的主页或者从其他高质量站点链接中发现了你的域名。如果你的网站在搜索引擎中权重不高、外部链接很少那么爬虫访问到你站点的概率自然低。这不是llms.txt格式的问题而是站点的整体可见度问题。你可以在首页、关于页、README 或开发者文档中显式添加AI 阅读入口https://example.com/llms.txt这样即使普通爬虫抓取了首页也可能顺着链接去找llms.txt。同时如果参与了一些开源社区、公众号或技术平台的活动外部链接增多后被爬虫再次访问的概率也会提升。5.4 是否提交到过官方社区或聚合目录目前llms.txt相关的社区、目录和讨论还在快速增长。某些项目会提供“站点提交”功能但这类提交并不等同于保证抓取。如果你愿意可以关注 GitHub 上关于llms.txt的讨论仓库、相关 Awesome 列表加入自己的站点链接。但要注意不要四处乱发链接以免被当成垃圾外链。更稳妥的方式是让站点内容本身有被检索的价值。llms.txt只负责把内容更容易地递给 AI但 AI 是否愿意访问取决于你的主题是否对它有参考意义。也就是说内容质量依然是最核心的变量。5.5 等待期与爬虫更新节奏新的文件格式从提出到被广泛支持需要一个较长的周期。有些大型模型厂商已经在研究和适配llms.txt但它们的调度频率可能以周甚至月为单位。换句话说可能爬虫确实“最终会来”只是还没到抓取周期。建议做法是把llms.txt当成长期资产来维护而不是发布后天天盯日志。你可以设置一个提醒每两周检查一次请求日志如果两个月内完全没有记录再考虑更高频的外部曝光策略。6. 如何提高 llms.txt 被读取的概率6.1 在首页正文中自然放置链接很多爬虫会从首页开始爬取。如果首页 HTML 中完全没有出现llms.txt那爬虫即使访问了首页也没理由继续请求这个文件。你可以在页面底部或“关于本站”区域加入类似文字a hrefhttps://example.com/llms.txt relnofollowAI 可读版本/a添加relnofollow不是必须的。如果你希望爬虫把它当作普通链接发现可以用正常链接。不过请不要把它放在导航栏中以免干扰普通用户体验。6.2 在 sitemap.xml 中添加地址llms.txt是一个文本文件但它是一个可以公开访问的 URL。在sitemap.xml中加入它是合法的可以让搜索引擎和部分爬虫额外发现这个地址urlset xmlnshttp://www.sitemaps.org/schemas/sitemap/0.9 url lochttps://example.com/llms.txt/loc /url /urlset提交之后可能不会立刻带来爬虫但至少多了一个被发现的渠道。注意sitemap.xml的 URL 集合一般面向网页把文本文件放进去不会影响其他页面收录但具体是否采用取决于爬虫实现。6.3 保证链接长期可用和内容更新爬虫读取一次之后如果发现文件内容长期不更新后续访问频率也可能降低。更新llms.txt时建议保留结构稳定不要频繁改文件名。如果站点新增了重要文章可以在对应章节追加链接也可以在简介里调整一到两句话。这里有一个容易忽略的点llms.txt里的链接必须是可稳定访问的绝对地址不要使用相对路径。因为爬虫可能从句法上识别链接但相对路径在纯文本中并不总是能正确处理。6.4 给 CDN 和源站设置合理的缓存时间缓存对于性能很有帮助但如果你每次更新llms.txt后没有刷新 CDN 缓存爬虫拿到的可能是旧版本甚至因为旧版本看起来没有变化而减少下一次访问。建议对llms.txt设置较短的缓存过期时间或使用版本号思路但保持文件名不变。上面 Nginx 配置中Cache-Control no-cache就是一种保守做法。当然较高的访问量下为一个小文件频繁回源也没必要。可以设置max-age3600这类短缓存例如add_header Cache-Control public, max-age3600;这表示 CDN 和浏览器可以缓存一小时对于大多数爬虫来说足够了。7. 常见问题与进一步排查7.1 为什么使用 curl 可以访问但爬虫没有记录大部分情况下这属于“爬虫还没来”的等待期问题。你可以先确认是否有GPTBot、ClaudeBot、Google-Extended等常见 AI 爬虫的 UA 访问过站点。在没有访问记录前先判断是否被 WAF 或地区限制拦住了。有些防火墙会拦截非浏览器的 User-Agent导致爬虫请求到达服务器前就被丢掉。你可以在安全日志中搜索llms.txt确认有没有被拦截的记录。如果确实被拦截解决方法是在 WAF 中放行包含常用 AI 爬虫 User-Agent 的 GET 请求并且只允许访问公开目录。不要为了放行而关闭整个 WAF安全边界比抓取更重要。7.2 是否需要把 llms.txt 提交到搜索引擎站长平台搜索引擎的站长平台主要面向普通 Web 页面收录目前没有统一的llms.txt提交入口。你可以在站长平台中提交首页或sitemap.xml让搜索引擎更快地索引站点整体地址但不能保证它一定读取llms.txt。所以不要把“提交站长平台”和“提交 llms.txt”混为一谈。未来会不会出现针对 LLM 内容的站长平台或目录目前还不确定。现阶段可以把它理解为“内容协作规范”而不是“提交协议”。7.3 如何在 Apache 中设置响应头如果你使用的是 Apache 而不是 Nginx可以在.htaccess或虚拟主机配置中添加Files llms.txt ForceType text/plain Header set Cache-Control no-cache /Files配置完成后重启 Apache 并验证。核心思路和 Nginx 一样确保纯文本输出、编码正确、缓存策略合理。7.4 如何检查是否有爬虫读取到了旧版本如果你使用的是 Git 管理的静态站点可以在部署脚本里输出llms.txt的变更时间。也可以在服务端给llms.txt增加一个自定义响应头add_header X-LLMs-Txt-Version 20250118;当你在日志中看到X-LLMs-Txt-Version时说明某次请求已经拿到了特定版本。这个头对爬虫没有决定作用但能方便你判断缓存是否刷新。7.5 是否可以把 llms.txt 写成 JSON不建议。虽然 JSON 是机器可读的但llms.txt的社区共识是纯文本 Markdown 风格。如果你同时提供llms.json也不会对现状产生什么帮助反而会分散注意力。让文件保持简单才更容易被不同实现兼容。8. 最佳实践与工程建议8.1 内容设计原则写llms.txt时始终站在“一个第一次访问你网站 AI”的角度思考。你不需要把所有文章都放进去只需要告诉它这个网站是谁。它主要提供什么价值。最值得读的 5 到 15 个链接。简介部分建议控制在 3 到 5 句话内。链接的锚文本不要太长但也不要只写“点击这里”。锚文本要能描述目标内容。比如“FastAPI 中文入门教程”就比“文章”更有价值。8.2 不要放入敏感信息很多人会把llms.txt理解为“给 AI 看的全部内容”于是把后台地址、内部 API、数据库地址也放了进去。这是非常危险的做法。llms.txt是公开文件任何人都能访问。里面只放你想公开分享的链接和信息权限相关的内容一律不要出现。同时不要生成任何包含用户隐私或个人身份信息的自动摘要。如果你用程序自动生成必须做脱敏和过滤。8.3 日志监控与异常告警llms.txt只是一个小文件但它能反映 AI 爬虫对你的站点关注度。建议单独在访问日志中记录该文件的状态码。比如使用 Nginx 的 map 或简单的 awk 过滤请求路径将非 200 状态码发送到告警系统。这样可以及时发现路径失效、权限变更等问题。一个简单的手动监控脚本思路#!/bin/bash urlhttps://example.com/llms.txt code$(curl -s -o /dev/null -w %{http_code} --max-time 10 $url) if [ $code ! 200 ]; then echo llms.txt 返回异常状态码: $code fi脚本可以放到定时任务里每天检查一次。生产环境中建议在测试环境多次验证后再执行避免频繁请求对源站产生压力。8.4 与站点改版联动当你做网站改版、迁移域名或修改目录结构时很容易忘记更新llms.txt里的链接。建议把llms.txt纳入发布清单和robots.txt、sitemap.xml一起检查。如果网站使用了批量生成工具可以写一个简单脚本自动抓取站点最新文章的标题和 URL生成llms.txt。但要注意自动化生成不要破坏文件顶部的固定简介和重点链接。比较合理的做法是把人工维护的“恒定部分”和程序生成的“最新文章部分”分开最终合并输出。8.5 不要为了抓取而不顾规范有些站点为了吸引 AI 爬虫会在llms.txt里堆满关键词或者编造不存在的链接。这样做短期内可能被某个爬虫多访问一次但长期损害的是站点信誉。大模型厂商很可能会对低质量内容做降权甚至直接忽略。所以llms.txt的使用应当遵循“真实、简洁、稳定”的原则。所有链接都应该可访问简介应该和实际内容匹配不能为了“AI 好看”而写一套和网页内容完全不一致的文字。9. 写在最后回到最初的困惑为什么llms.txt没人抓取最直接的原因是它还不是一个所有爬虫默认读取的强制协议更像是一份“给 AI 提供的主动合作文件”。你部署它相当于在网站门口立了一块清晰的指示牌但门口没有专门负责读指示牌的人。因此“没被抓取”大概率不是配置失败而是发现机制尚未成熟。下一步你可以做三件事再次检查llms.txt的格式、路径、响应头和缓存策略确保它时刻可访问。在首页、sitemap 和技术社区外链中增加它的曝光让爬虫有机会发现。持续更新内容把这些内容当成一种长期资产去维护。如果你已经完成了这些还是迟迟等不到请求也不用过度焦虑。llms.txt才刚刚开始被更多人讨论早一点把基础打扎实等到各类模型厂商普遍支持的时候你的站点已经比别人多走了一步。多尝试一些网站观察别人的格式和更新频率也许你会找到更适合自己站点的做法。希望这篇文章能帮你理清思路如果你的llms.txt也遇到类似的冷启动问题不妨从今天开始按照上面的清单逐项排查。