RSS 和 sitemap 是怎么被爬虫看到的

Nuxt 与服务端渲染

两个都是 XML,作用完全不同,我一开始以为是一回事。

sitemap 是给搜索引擎的地址清单:"我这儿有哪些地址,最后什么时候改的"。它不要求实时,但要全,且列出的地址必须能访问。

<url>
  <loc>https://example.com/posts/hello</loc>
  <lastmod>2026-04-27</lastmod>
</url>

lastmod 有用。改动后重新提交,被抓取的速度比没有快,因为爬虫能判断这条值不值得再来一次。要注意 lastmod 应该是内容真的改过的时间,不是构建时间——如果每次部署所有条目的 lastmod 都变,它就失去了信息量,爬虫会开始不信这个字段。

sitemap 本身要能被 robots.txt 指到:

Sitemap: https://example.com/sitemap.xml

robots.txt 里挡什么要仔细。我挡的是 /api/ 和 /admin/,这两个确实不该进索引。有一处我差点挡错:/uploads/。图片路径在 robots 里被 Disallow 的话,抓取方拿不到分享卡片和搜索结果里的图,等于自己削弱展示效果。

RSS 是给订阅者的内容流,人要看的。所以它要包含正文全文,而不只是摘要——订阅的人不想再点一次链接。

<channel>
  <title>...</title>
  <link>https://example.com</link>
  <description>...</description>
  <item>
    <title>...</title>
    <link>https://example.com/posts/hello</link>
    <guid isPermaLink="true">https://example.com/posts/hello</guid>
    <pubDate>Fri, 24 Apr 2026 09:00:00 GMT</pubDate>
    <description><![CDATA[ ... 正文 HTML ... ]]></description>
  </item>
</channel>

四个细节我都错过至少一次。

pubDate 的格式是 RFC 822,不是 ISO。直接把 new Date().toISOString() 塞进去,订阅器会报错或者当成没日期,条目顺序乱掉。要用 toUTCString()。

guid 用永久链接,别用自增 id。换域名之后订阅者会以为所有文章都变了,全部重推一遍。

CDATA 里的正文要转义。文章里出现 ]]> 会把 CDATA 提前结束,我的处理是把它拆成 "]]" + ">"。这种边角情况一年碰不到一次,碰到了就是订阅端解析失败。

条目数量要有限制。全量输出意味着 RSS 文件会随文章数无限增长,而我第一版就是全量——一百篇之后那个 XML 有 2MB。改成最近 30 篇,加一个 /rss.xml 的缓存。

还有一处是做完才发现的:这两个地址要在 HTML 里声明,别人才发现得了。

<link rel="alternate" type="application/rss+xml" href="/rss.xml" title="站点名">

我做完这步才有第一个订阅者。之前 RSS 是"存在但没人知道",跟没做一样。

相关阅读