Bash 交叉验证 robots.txt 和 sitemap:两个文件自相矛盾,页面永远收录不了
robots.txt 和 sitemap 是网站给爬虫的两份"说明书",一个说"哪些地方别来",一个说"哪些页面在这里"。这俩本该互相配合,但实际建站时经常写出矛盾:robots.txt 里声明的 sitemap 地址打不开,或者 sitemap 里列的页面路径,恰好被 robots.txt 的 Disallow 挡住了。结果就是谷歌和 AI 爬虫想收录也收录不了,你还不知道问题出在哪。
这篇写一个 Bash 脚本,把 robots.txt 和 sitemap 拉出来交叉验证,矛盾的地方一次标出来。
robots.txt 的规则看这里:robots.txt 简介,sitemap 的标准看这里:构建 sitemap。
工具能检查什么
- robots.txt 里声明的 sitemap 地址能否正常访问(HTTP 200)
- 列出 robots.txt 里的 Disallow 规则,方便和 sitemap 对照
依赖:curl、grep、sed。Windows 上在 Git Bash 或 WSL 里跑。
完整代码
bash
#!/bin/bash
# robots-sitemap-check.sh
# 用途:交叉验证 robots.txt 声明的 sitemap 是否可访问,并列出 Disallow 规则
# 依赖:curl、grep、sed
# 用法:bash robots-sitemap-check.sh https://example.com
DOMAIN="${1:-https://example.com}"
DOMAIN="${DOMAIN%/}"
echo "===== robots.txt 与 sitemap 交叉验证 ====="
echo ""
robots=$(curl -sL -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0" "$DOMAIN/robots.txt")
if [ -z "$robots" ]; then
echo "robots.txt 抓取失败,检查域名是否正确"
exit 1
fi
echo "robots.txt 抓取成功,长度 ${#robots} 字符"
echo ""
echo "robots.txt 里声明的 sitemap:"
sitemaps=$(printf '%s' "$robots" | grep -i '^sitemap:' | sed 's/^[Ss]itemap:[[:space:]]*//' | tr -d '\r')
if [ -z "$sitemaps" ]; then
echo " (未声明任何 Sitemap,建议加上 Sitemap: 行)"
else
printf '%s\n' "$sitemaps" | while read -r s; do
code=$(curl -sL -o /dev/null -w "%{http_code}" -A "Mozilla/5.0" "$s")
if [ "$code" = "200" ]; then
echo " $s -> HTTP 200(可访问)"
else
echo " $s -> HTTP $code(打不开!检查 sitemap 路径)"
fi
done
fi
echo ""
echo "robots.txt 里的 Disallow 规则:"
disallows=$(printf '%s' "$robots" | grep -i '^disallow:' | sed 's/^[Dd]isallow:[[:space:]]*//' | tr -d '\r' | sort -u)
if [ -z "$disallows" ]; then
echo " (无 Disallow 规则)"
else
printf '%s\n' "$disallows" | sed 's/^/ /'
fi
echo ""
echo "提醒:对照上面的 Disallow 规则,检查 sitemap 里的 URL 路径是否命中。"
echo "命中 Disallow 的页面不会被谷歌收录,AI 爬虫也读不到。"
echo "===== 结束 ====="
怎么用
bash
bash robots-sitemap-check.sh https://你的域名
先看声明的 sitemap 能不能打开,再把 Disallow 规则和 sitemap 里的 URL 路径对照一遍,矛盾就现形了。
三个最常见的矛盾
声明的 sitemap 地址打不开。 robots.txt 里写了 Sitemap: https://example.com/sitemap.xml,但那个地址返回 404 或 500。爬虫按图索骥去读,扑个空。声明了却打不开,等于没声明。
Disallow 把 sitemap 里的页面挡住了。 这是最隐蔽的。比如 sitemap 里有 https://example.com/product/a,robots.txt 里却写了 Disallow: /product/。爬虫读到 sitemap 想收录,一看 robots 说不许抓,直接放弃。页面永远进不了索引。
Disallow 规则写太宽。 有人想挡后台 /admin/,结果误写成 Disallow: /,把全站都挡了。或者挡 /css/、/js/ 时把关键的资源路径也挡了,导致页面渲染不全。规则要精确,别一挡一大片。
写在最后
robots.txt 和 sitemap 是网站最基础的两个配置,却最容易写出互相打架的矛盾。写完之后跑一遍交叉验证,把声明的 sitemap 和 Disallow 规则对一遍,能避免"页面永远收录不了却找不到原因"这种隐形损失。
延伸阅读:谷歌 SEO 系统实操。
觉得有用欢迎点赞、收藏、转发,有疑问评论区留言或私信交流。