<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Discovery · XB 现场笔记</title><link>https://hk.xbcatm.com/zh/tags/discovery/</link><description>基于 HTTP、DNS、TLS、Caddy、SSH、发布与恢复的可复现运维现场笔记。</description><generator>Hugo</generator><language>zh-CN</language><atom:link href="https://hk.xbcatm.com/zh/tags/discovery/index.xml" rel="self" type="application/rss+xml"/><item><title>robots.txt 与 sitemap 回答不同的问题</title><link>https://hk.xbcatm.com/zh/notes/robots.txt-and-sitemaps-answer-different-questions/</link><pubDate>Tue, 21 Jul 2026 00:00:00 +0000</pubDate><guid>https://hk.xbcatm.com/zh/notes/robots.txt-and-sitemaps-answer-different-questions/</guid><description>把爬虫偏好、URL 发现与访问控制分开。</description><content:encoded>&lt;p&gt;两个小文件常被当成安全边界使用，但它们不是。&lt;code&gt;robots.txt&lt;/code&gt; 描述爬虫偏好，sitemap 则给搜索系统一份属于该站点的 URL 清单。&lt;/p&gt;
&lt;figure class="technical-diagram"&gt;&lt;img loading="lazy" src="https://hk.xbcatm.com/visuals/discovery-map.detail.zh.svg" alt="源站根路径上的 UTF-8 robots.txt 是配合爬虫的偏好文件，不是认证或可靠的搜索索引删除机制。检查 sitemap 根元素：跟随 sitemapindex 中的语言 sitemap，或读取直接的 urlset。使用单一主机的规范绝对 URL。XML 语法正确不足以验证：还需检查命名空间、数量、主机与页面存在性。每份 sitemap 最多 50,000 个 URL、未压缩 52,428,800 字节，gzip 不提高限制。私有路由需要服务器授权或网络边界。RFC 9309 对 4xx 的 robots 不可用允许抓取；网络或服务器错误最初要求全部禁止。可达的 200 HTML 兜底页不能证明 robots 正确。" width="720" height="3560"&gt;&lt;figcaption&gt;发现工具不会授予或拒绝访问。继续检查索引列出的每份 sitemap，验证不止 XML 语法，并按真实错误类别处理 robots 响应。&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3 id="robotstxt-能做什么不能做什么"&gt;robots.txt 能做什么、不能做什么&lt;/h3&gt;
&lt;p&gt;规则发布于源站根路径 &lt;code&gt;/robots.txt&lt;/code&gt;，由配合的爬虫读取。它不会保护私有目录、不会从网络上移除 URL，也不能替代认证。不应公开的路由需要服务器授权或网络边界。&lt;/p&gt;
&lt;p&gt;让文件保持平实，并测试它的实际位置：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;User-agent: *
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Disallow:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Sitemap: https://www.example.test/sitemap.xml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;文件应为 UTF-8。如果部署会重定向它，请核验你想要的爬虫行为，而不是假设每个客户端都遵循同一条链。&lt;/p&gt;
&lt;h3 id="sitemap-增加了什么"&gt;sitemap 增加了什么&lt;/h3&gt;
&lt;p&gt;sitemap 是一份清单，而不是权限列表。使用单一主机的绝对 URL、正确做 XML 转义，并且只列出你准备发布的规范页面。不要因为某个 URL 存在于构建目录就把它列出。&lt;/p&gt;
&lt;p&gt;每份 sitemap 最多包含 50,000 个 URL，未压缩大小不超过 50 MB（52,428,800 字节）；gzip 不会提高该限制。小站可以不用 index，但多语言生成器也可以合理地生成指向各语言 sitemap 的索引。应检查根元素并继续检查列出的各份 sitemap，而不是假设 &lt;code&gt;/sitemap.xml&lt;/code&gt; 一定是 URL 集合。把它的 XML 校验通过，并像普通页面一样通过同一 HTTPS 边缘请求它。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -fsS https://www.example.test/robots.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -fsS -o sitemap.xml https://www.example.test/sitemap.xml &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; xmllint --noout sitemap.xml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;把下载与解析分开，避免下载失败被解析成功掩盖。XML 格式正确只代表语法通过；还要验证命名空间、URL 数量、规范主机名，以及列出的页面是否存在。若未安装 &lt;code&gt;xmllint&lt;/code&gt;，请在发布它的同一个 CI 环境里解析该 XML。重要的是检查要在文件被替换到边缘之前运行。&lt;/p&gt;
&lt;p&gt;robots 的 &lt;code&gt;Disallow&lt;/code&gt; 不是可靠的搜索索引删除指令。还要测试错误响应：RFC 9309 在 robots 返回 4xx、表示文件不可用时允许抓取，而网络或服务器错误在最初要求全部禁止。意外返回状态为 200 的 HTML 兜底页，因此可能改变爬虫行为，即使 URL 看起来仍然可访问。&lt;/p&gt;
&lt;h2 id="来源"&gt;来源&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc9309.html"&gt;RFC 9309 — Robots Exclusion Protocol&lt;/a&gt;，robots 规则、文件位置与 user-agent 匹配，已核验 2026-07-21。&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.sitemaps.org/protocol.html"&gt;Sitemaps Protocol&lt;/a&gt;，sitemap XML 结构与发现，已核验 2026-07-21。&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item></channel></rss>