sitemap.xml、robots.txt 与 RSS:让站点能被找到

站点做好了,还得让搜索引擎和读者能「找到」它。三个小文件就能解决大部分问题,而它们的成本几乎为零。

一、robots.txt:告诉爬虫什么能抓

放在站点根目录,内容就是几行规则:

bash
# /robots.txt
User-agent: *
Allow: /
Disallow: /admin/

Sitemap: https://www.bzii.cn/sitemap.xml

常用指令:

指令含义
User-agent: *对所有爬虫生效
Disallow: /path禁止抓取该路径
Allow: /path允许(用于在 Disallow 范围内开例外)
Sitemap:声明 sitemap 地址
Crawl-delay: 1每次抓取间隔秒数

robots.txt 是君子协定,恶意爬虫不会遵守。想真正防抓取要用鉴权或封 IP。

二、sitemap.xml:把页面清单交出去

xml
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://www.bzii.cn/</loc>
    <lastmod>2026-09-17</lastmod>
    <changefreq>weekly</changefreq>
    <priority>1.0</priority>
  </url>
  <url>
    <loc>https://www.bzii.cn/#/post/domain-and-dns</loc>
    <lastmod>2026-09-02</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
</urlset>

字段说明:

字段含义是否必需
loc页面完整 URL必需
lastmod最后修改时间建议
changefreq更新频率(搜索引擎仅供参考)可选
priority相对优先级 0.0~1.0可选

三、用脚本自动生成 sitemap

手写 XML 太蠢,尤其是文章多了以后。本站的做法是用脚本从 posts.js 里读数据生成:

bash
#!/usr/bin/env bash
# gen-sitemap.sh —— 从 posts.js 提取文章 id 与日期,生成 sitemap.xml
set -euo pipefail

BASE="https://www.bzii.cn"
SRC="assets/js/posts.js"
OUT="sitemap.xml"

{
  echo '<?xml version="1.0" encoding="UTF-8"?>'
  echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'
  echo "  <url><loc>$BASE/</loc><changefreq>weekly</changefreq><priority>1.0</priority></url>"

  # 提取 id 与 date(依赖 posts.js 的固定格式)
  grep -oE "id: '[^']+'|date: '[0-9-]+'" "$SRC" \
    | sed "s/id: '//; s/date: '//; s/'$//" \
    | paste - - \
    | while read -r id date; do
        echo "  <url><loc>$BASE/#/post/$id</loc><lastmod>$date</lastmod><priority>0.8</priority></url>"
      done

  echo '</urlset>'
} > "$OUT"

echo "生成完成: $(grep -c "<url>" "$OUT") 条"

这个脚本依赖 posts.jsid:date: 交替出现的顺序。如果格式有变,脚本也要跟着调整——所以更好的办法是用 Node 直接 require 那份数据再输出 XML。

用 Node 会更稳:

bash
node -e "
global.window = {};
require('./assets/js/posts.js');
const posts = window.POSTS;
const base = 'https://www.bzii.cn';
const urls = posts.map(p =>
  `  <url><loc>${base}/#/post/${p.id}</loc><lastmod>${p.date}</lastmod></url>`
).join('\\n');
console.log('<?xml version="1.0" encoding="UTF-8"?>');
console.log('<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">');
console.log(`  <url><loc>${base}/</loc><priority>1.0</priority></url>`);
console.log(urls);
console.log('</urlset>');
" > sitemap.xml

四、RSS:让订阅的人不漏更新

RSS 是「读者友好度」最高的一样东西:读者用阅读器订阅,你更新他就能看到,不依赖算法推荐。

最小可用的 RSS 格式:

xml
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>白泽网络 · 技术实践笔记</title>
    <link>https://www.bzii.cn/</link>
    <description>网站搭建、服务器、域名与 DNS 的实践记录</description>
    <language>zh-CN</language>
    <item>
      <title>域名注册与 DNS 解析</title>
      <link>https://www.bzii.cn/#/post/domain-and-dns</link>
      <guid>https://www.bzii.cn/#/post/domain-and-dns</guid>
      <pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate>
      <description>选后缀、挑注册商、托管 DNS……</description>
    </item>
  </channel>
</rss>

注意 pubDate 必须是 RFC 822 格式(不是 ISO 8601),Date 对象可以直接生成:

bash
date -R -d "2026-09-02"
# Wed, 02 Sep 2026 00:00:00 +0800

五、在页面里声明它们

html
<!-- RSS 自动发现:阅读器和浏览器能自动找到 -->
<link rel="alternate" type="application/rss+xml" title="RSS" href="/feed.xml">

<!-- canonical:告诉搜索引擎「这才是正牌地址」,避免多域名重复收录 -->
<link rel="canonical" href="https://www.bzii.cn/">

canonical 对多域名(www.bzii.cn / www.bzii.cn)尤其重要,能避免被判定为重复内容。

六、提交给搜索引擎

平台入口备注
Google Search Consolesearch.google.com/search-console提交 sitemap,看收录情况
Bing Webmaster Toolsbing.com/webmasters同时供 ChatGPT 搜索等使用
百度搜索资源平台ziyuan.baidu.com国内收录主要靠它

提交之后一般几天到几周才会收录,急不来。真正的加速方式是:让别的站点链到你

七、本站的现实情况

诚实地说一句:本站用的是 hash 路由(#/post/xxx),搜索引擎对 hash 后的内容抓取支持很差,sitemap 里写 hash URL 效果有限。

这是「可以离线双击打开」换来的代价。如果你的站点很在意收录,有两个办法:

  1. 改成真实路径路由 + 服务端回退到 index.html(放弃 file:// 直开);
  2. 另外生成一套静态 HTML 副本(每篇文章一个 .html),只给爬虫看。

对个人笔记站来说,我接受这个取舍——能被自己随时翻到,比被搜索引擎收录更重要


robots.txt + sitemap.xml + feed.xml 三个文件加起来不到 5KB,该加的都加上,不亏。