sitemap.xml、robots.txt 与 RSS:让站点能被找到
站点做好了,还得让搜索引擎和读者能「找到」它。三个小文件就能解决大部分问题,而它们的成本几乎为零。
一、robots.txt:告诉爬虫什么能抓
放在站点根目录,内容就是几行规则:
# /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 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 里读数据生成:
#!/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.js里id:和date:交替出现的顺序。如果格式有变,脚本也要跟着调整——所以更好的办法是用 Node 直接require那份数据再输出 XML。
用 Node 会更稳:
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 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 对象可以直接生成:
date -R -d "2026-09-02"
# Wed, 02 Sep 2026 00:00:00 +0800五、在页面里声明它们
<!-- 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 Console | search.google.com/search-console | 提交 sitemap,看收录情况 |
| Bing Webmaster Tools | bing.com/webmasters | 同时供 ChatGPT 搜索等使用 |
| 百度搜索资源平台 | ziyuan.baidu.com | 国内收录主要靠它 |
提交之后一般几天到几周才会收录,急不来。真正的加速方式是:让别的站点链到你。
七、本站的现实情况
诚实地说一句:本站用的是 hash 路由(#/post/xxx),搜索引擎对 hash 后的内容抓取支持很差,sitemap 里写 hash URL 效果有限。
这是「可以离线双击打开」换来的代价。如果你的站点很在意收录,有两个办法:
- 改成真实路径路由 + 服务端回退到 index.html(放弃
file://直开); - 另外生成一套静态 HTML 副本(每篇文章一个 .html),只给爬虫看。
对个人笔记站来说,我接受这个取舍——能被自己随时翻到,比被搜索引擎收录更重要。
robots.txt + sitemap.xml + feed.xml 三个文件加起来不到 5KB,该加的都加上,不亏。
