当CMS、路由中间件、前端框架和反向代理都可能改写内链网址时,唯一责任方应定义为“最终把链接写入HTML的那一层”,而不是最早产生URL的那一层。判断依据不是谁配置了规则,而是谁在响应体里输出了可抓取的<a href>。如果这一层不明确,任何内链修复都会变成互相推责。
一个常见矛盾是:运营在CMS里把栏目路径从/old/改成/new/,页面模板也更新了,但抓取到的内链仍然指向旧路径。直觉会认为“CMS改了,内链就该改”。实际结果相反,说明至少还有一层在生成或覆盖最终URL。
这类现象通常有两个解释。第一种是渲染层覆盖:服务端模板输出新路径,但前端框架在客户端再次渲染时用了自身路由表,最终DOM里的链接回到旧路径。第二种是代理层重写:反向代理或网关在响应返回前做了URL重写,把新路径替换回旧路径,或者反过来把旧路径统一成新路径。
区分它们不需要猜测,只需要对比不同位置的输出。用同一批页面,分别查看原始HTML响应、执行JavaScript后的DOM、以及经过代理后的最终响应。
如果只看最终页面,两种解释会给出相同结果,所以必须拿到中间态证据。中间态证据的获取方式本身也影响结论:只抓最终DOM,会把代理重写误判成渲染覆盖。
唯一责任方不是“配置最多的一层”,而是对最终HTML中链接值有最后写入权的一层。定义步骤可以固定为三步,每一步都产出可核对的证据。
这里有一个容易忽略的取舍:把责任方定在“最后写入层”会让修复动作更直接,但可能掩盖上游规则冲突。因此定义责任方之后,还应要求上游层停止生成绝对URL,只提供相对路径或标识符,由责任方统一拼接。
假设某站点有CMS、网关和前端框架三层。CMS输出/a/,网关把/a/重写为/b/,前端框架又根据自身路由把/b/渲染为/a/。最终抓取到的内链是/a/。
此时如果只看最终结果,会误以为CMS没改。实际最后写入权在前端框架,唯一责任方应定为前端路由层。动作是让前端路由不再改写内链,只消费服务端给出的路径;结果是最终HTML中的链接与网关输出一致。下一步再检查网关是否仍需保留重写规则,避免规则长期漂移。
内链请求量下降、抓取量变化或某个路径的统计归零,都不能单独证明责任方是谁。这些现象还可能来自抓取预算调整、页面可见性变化、外部链接减少或统计口径变化。把它们当作唯一证据,容易把责任错误地推给某一层。
同样,站点地图不保证收录,robots.txt的抓取限制不等于可靠的索引移除。内链责任方的判断只应基于“谁最后写入最终HTML中的链接值”,而不是基于收录或抓取结果反推。把责任方定义清楚之后,再决定是否需要调整站点地图或抓取规则,顺序不应颠倒。
最终要固定一条规则:内链的唯一责任方必须在最终HTML输出层,并且该层拥有对链接值的最后写入权;其他层只提供数据,不生成最终可抓取网址。这样出现异常时,排查范围可以从“所有系统”缩小到“最后写入层及其直接上游”。