一个站点在域名层面往往不止一个入口:www 与非 www、手机站、博客、帮助中心、静态资源域名、接口域名、活动专题域名。对访问者来说这些都是一家公司;对搜索蜘蛛来说,它们首先是不同的主机名,抓取、判断和索引都会分开处理。理解这一点,能解释不少「内容明明一样、抓取表现却完全不同」的情况。
主机名是蜘蛛最基础的分组单位
蜘蛛的抓取队列、robots.txt 的生效范围、Sitemap 的归属,基本都按 协议 + 主机名 来划分。也就是说 https://www.example.com 和 https://example.com 在抓取层面是两个对象:各自需要能被访问到,各自有自己的 robots.txt 生效范围,各自需要被发现入口。少一个环节,那一侧的抓取就会明显稀疏。
www 与非 www:先确定唯一主地址
如果两种写法都返回 200,蜘蛛很可能两条都抓、都尝试入库,后面再靠规范化信号去合并,这个过程既浪费抓取动作,也让日志分析变得难读。更省事的做法是选一个作为主地址,另一个用 301 永久跳过去,并且全站内链、Sitemap、对外分享统一使用主地址。
301、canonical、Sitemap 里的地址都属于「建议」,蜘蛛仍要先把旧地址抓一遍才能读到这些信号。所以要缩短路径,关键是入口尽量少、写法尽量一致。
子域名:能顺着链接抓过去,但不等于同一个站点
把博客、帮助中心、商城放在 blog.example.com、help.example.com 下很常见。它们通过主域的内链能被正常发现,抓取本身没有障碍;但从站点识别角度看,子域名通常被当作相对独立的实体对待,抓取表现、索引状态会各算各的。
所以「用子域名还是子目录」的取舍点在于内容关系:如果内容属于同一主题体系、需要互相借力,子目录通常更直接;如果是独立品牌、独立运营、独立技术栈,子域名反而更清晰。两种选择都没有绝对优劣,怕的是含混——一半内容在子域、一半在子目录,内链又互相缠绕。
子域名的入口不能只靠主域导航
子域名如果只被主域某一处链接指过去,蜘蛛的抓取路径就会拉长;反之,如果子域名自己有导航、有列表页、有内链闭环,蜘蛛进入一次就能展开。给每个主机名准备一份 Sitemap,在各自 robots.txt 里声明,是成本最低的一步。
资源域名和接口域名不该参与 URL 发现
img、static、cdn、api 这类主机名通常不需要被索引。可以这样处理:
- 不要把它们的 URL 写进任何 Sitemap;
- 每个主机名下放一份 robots.txt,明确禁止抓取;
- 页面里不产生指向这些域名的、蜘蛛能跟随的超链接,资源用图片、脚本、样式引用即可;
- 域名本身给出明确响应,或干脆不解析到公网,避免出现一个空白首页被抓走。
需要留意的是,robots.txt 只约束抓取,不约束 URL 被外部链接、日志或其他页面暴露出来。所以「入口不出现」比「事后拦截」更靠前一步。
跨主机名的内链:抓取会顺着走
主域正文里链到子域,蜘蛛会顺着抓;子域链回主域同理。跨主机名不会让抓取「重置」,它同样消耗一次抓取机会。因此不要把重要页面藏在很深的子域页面里,也不要用子域名做大量与主站内容无关的跳转层。链接层级越浅、上下文越相关,蜘蛛越容易判断这个地址值不值得继续跟。
域名迁移或合并时的顺序
把几个主机名收敛成一个时,顺序比速度重要:
- 先在目标主机名把页面做全,确认可正常访问、结构完整;
- 再从旧主机名逐条 301 到对应新地址,避免全站一律跳到首页;
- 同步更新内链、Sitemap、canonical 和页面里写死的绝对地址;
- 观察一段时间服务器日志,看旧主机名的抓取是否逐步减少、新主机名是否逐步增加。
如果这一步做急了,旧地址先跳、新页面还没铺好,蜘蛛抓到的是空壳,重新被发现又要再等一轮。
把域名边界写清楚
域名结构不是越少越好,而是边界要清楚:哪些主机名是给蜘蛛抓的,哪些不是;哪个是主地址,其余怎么指向它;每个主机名的 robots.txt 和 Sitemap 是否各就各位。边界清楚,蜘蛛脚下的路径就短,URL 发现这件事也从「碰运气」变成了「可维护」。