结论先说:如果同一份内容能通过含大写的路径和全小写路径分别返回 200,而你的站内链接、站点地图和规范标签指向不统一,那么你看到的收录异常很可能不是内容质量问题,而是路径身份被拆成了多个。要统一映射,先做一件事:选定唯一的小写规范路径,让其余大小写变体以 301 跳到它,并让所有内链、站点地图和 canonical 都指向这个唯一形式。这个结论有适用条件,下面说清楚。
在多数 Linux 系服务器和对象存储上,/Page 与 /page 是两个不同资源,各自能返回 200。爬虫把它们当作两个网址分别抓取,于是同一篇内容出现两条记录。你查收录时会看到直觉相反的结果:内容没改,却多出一条“重复”或一条“被选为规范”的陌生网址。
更麻烦的是,这种拆分往往不是全站性的,而是集中在某几个模板、某次批量导入或某段程序拼接的链接上。所以先别急着改内容,先确认路径身份是否被拆分。
同一现象至少有三种合理解释,需要分别取证,不能只凭收录数量变化下判断。
/Page 和 /page 都返回 200 且内容一致,但服务器实际做了内部重写。此时看响应头和最终 URL 是否变化。取证动作:用命令行分别请求大写和小写路径,记录状态码、Location 头和最终响应体是否一致。如果两个请求都 200 且响应体一致,说明是第二种;如果其中一个返回 301 且 Location 指向另一个,说明是第三种。这一步的结果直接决定下一步是改服务器配置还是只改链接。
两个选择都成立,取决于你的站点能否在服务器层稳定拦截。
条件一:你能控制服务器或路由层。 在服务器配置里对所有非小写路径做 301 到对应小写路径。这样无论站内链接写错还是外部链接写错,最终都会收敛到一个网址。动作是加一条规则并验证:请求大写路径应返回 301,Location 为小写形式,且小写路径返回 200。
条件二:你无法改服务器,只能改内容层。 那就统一站内所有链接、站点地图、canonical 和 hreflang 的小写形式,并在模板层做一次输出归一化。但要注意:这不能拦住外部已经写成大写的链接,那些入口仍可能各自被抓取。所以这一层只能减少新增拆分,不能完全消除已有拆分。
取舍点在于:服务器层 301 覆盖面更广,但需要确认不会误伤确实区分大小写的资源;内容层改动更安全,但对外部链接无能为力。如果站点同时存在这两种情况,优先做服务器层,再补内容层。
假设你的站点确实存在两个不同资源,只是名字恰好只在大小写上不同,例如 /API 和 /api 分别指向不同文档。这时把所有大写路径一律 301 到小写,会把一个真实资源跳转到另一个,造成错误。这种情况下不能做全局小写归一化,只能对确认是同一内容的路径做定向映射。
判断依据:分别请求两个路径,比较响应体、标题和主要结构。如果内容实质不同,就不属于同一资源,不能合并。这一步必须在批量加规则之前做,否则规则上线后很难回退。
先选一个模板或一个目录做小范围验证,不要一次全站上线。
Location 指向小写规范路径。验证通过后再扩大到全站。如果小范围验证时发现某些路径内容不同,就把它们排除在规则之外。收录数量的短期波动不能单独证明处理正确,还要结合状态码和最终 URL 是否一致来判断。站点地图和 canonical 能帮助表达你的偏好,但不保证收录结果,所以最终仍要以服务器实际返回的状态码为准。