很多站点上线时会在 robots.txt 里写一行 Sitemap 地址,然后这件事就再也没有被提起过。半年后回头看,那个 XML 文件里还留着已经下线的栏目、改过路径的旧地址,以及一堆 lastmod 停在上线当天的记录。蜘蛛照样会来,但它拿到的是一份过期的地图。
站点地图解决的是什么问题
站点地图不保证收录,也不提升排名,它的作用只有一件事:告诉抓取端这里有哪些地址、以及大概什么时候更新过。对于链接层级深、内链稀疏,或者新页面一时半会儿进不了导航的站点,它是一个比较可靠的补充渠道。如果站点本身结构扁平、内链完整、蜘蛛每天都来,那站点地图的重要性会下降,但维护成本也很低,没有理由放着不管。
分片与索引文件
单个 sitemap 文件有地址数量和体积的上限,一般按 5 万条 URL、未压缩 50MB 来规划。超过之后不是能不能提交的问题,而是抓取端可能读不完或者干脆放弃。常规做法是按栏目、按内容类型或者按时间切分,比如文章、商品、专题各一个文件,再用一个 sitemap 索引文件把它们列出来。索引文件本身不要再嵌套索引,层级越浅越好。
- 按栏目切分最直观,出问题时也方便单独排查
- 如果某个栏目更新极快,可以再按月份切片,避免整份文件频繁变动
- 索引文件和子文件的地址保持同域名,不要跨域引用
lastmod 要真实
lastmod 是最容易被滥用的字段。有人每次生成 sitemap 就把所有页面的时间刷成当前时间,结果是每天都告诉抓取端全站都更新了,久而久之这个字段就失去了参考价值。更稳妥的做法是让它来自内容本身的实际修改时间,模板调整、样式改版这类不影响正文的改动不要动它。
如果一份 sitemap 里所有页面的 lastmod 都是同一天,那它提供的更新信号基本等于零。
不该放进去的地址
站点地图是推荐抓取的清单,不是全站地址备份。下面这些放进去只会浪费抓取机会:
- 已经返回 404 或 410 的页面
- 会 301 跳转的旧地址,直接放跳转后的目标地址就行
- 设置了 noindex 的页面
- 带筛选参数、排序参数产生的重复地址
- 需要登录才能看到内容的页面
- 站内搜索结果页和临时生成的列表页
前几类属于互相矛盾:一边告诉抓取端别索引,一边又把它列进推荐清单,只会让判断变复杂。
生成方式
静态站可以靠构建脚本生成;内容管理系统一般有现成插件,但插件默认配置往往把草稿、附件、标签全塞进来,需要手动调整范围。手工维护一份纯静态 XML,在几百个页面以内还能接受,再往上就容易和真实内容脱节。无论哪种方式,关键是把生成这一步接到内容发布流程里,让新页面出现时自动进文件、页面下线时自动移除,而不是靠人定期补。
提交之后的监控
把地址写进 robots.txt 只是起点。之后要看的指标其实很少:文件是否能正常访问、返回状态是不是 200、里面的地址是否还是 200、数量有没有异常突增或骤减。数量骤减通常是生成脚本出错,骤增往往是参数地址漏了进来。这些异常在服务器日志和抓取统计里都能看到,不需要额外的工具。
一个可执行的自查清单
- 直接访问 sitemap 地址,确认返回 200 且内容是 XML
- 抽查十个里面的地址,确认都是 200 且能正常打开
- 确认文件里没有 404、301、noindex 的地址
- 确认 lastmod 与页面实际更新时间一致
- 确认索引文件能列出全部子文件,且子文件都能访问
- 确认 robots.txt 里的 Sitemap 地址拼写正确、没有多余斜杠
- 在内容发布流程里找到新页面如何进入 sitemap 这一步,确认它是自动的
这件事本身不复杂,难点在于它容易被忘掉。把它和栏目调整、内容下线放在同一个检查流程里,比单独记一个待办要可靠得多。