先给结论:当同一 URL 的静态 HTML 返回 200 并带有内容,而浏览器执行脚本后却出现 404 视图、空壳或跳转,不要直接把它归为死链。正确做法是把“服务器返回的静态响应”和“脚本执行后的最终 DOM”分别留档,再判断差异发生在哪一层:HTTP 状态、重定向链、脚本请求还是客户端路由。只有确认脚本请求的目标资源确实不存在,才进入死链处理流程。
你手里要处理的页面,通常来自搜索引擎工具、监控告警或用户反馈。第一步不是改链接,而是对同一个 URL 采集两份证据:一份是禁用 JavaScript 后的原始响应,一份是允许脚本执行后的最终页面。
Location、Content-Type,以及正文里是否出现目标链接或占位容器。假设一个商品页静态返回 200 且正文包含商品名,但脚本执行后显示“页面不存在”。这时真正的死链可能不是这个页面,而是脚本随后请求的接口或数据文件。若直接给这个 URL 做 301,反而会把一个可用的静态页跳走,损失已有内容。
差异可以发生在四个层级,每一层的处理动作不同,判断依据也不同。
可区分的原因证据是:禁用 JavaScript 后页面仍有完整内容,说明静态层可用;若禁用后为空、开启后才有内容,则页面高度依赖脚本,死链判断必须以后续请求为准。
假设某分类页静态返回 200,正文包含分类标题和若干链接;脚本执行后,列表区域为空并提示加载失败。控制台显示对 /api/category/123 的请求返回 404。
此时可执行的动作是:先保留分类页 URL,不急于设置 301;再确认 123 这个分类是否已下线。若分类仍存在但接口路径变更,应修复接口映射;若分类确实已合并,则把分类页 301 到新分类页,并同步更新站内指向该分类的链接。这个动作的结果会直接影响下一步:接口修复后页面恢复,说明原 URL 应继续保留;分类合并后,才需要处理旧链接的跳转与站点地图更新。
另一个假设:静态响应 200,脚本执行后 URL 变成 /error。若 Location 或客户端跳转指向错误页,而原 URL 内容仍可静态读取,则应优先修脚本跳转逻辑,而不是把原 URL 当死链删除。若确认原 URL 已无对应内容,再按死链处理。
第一,确认抓取限制与索引结果的关系。robots.txt 的抓取限制不等于可靠的索引移除;页面被限制抓取,仍可能因外部链接出现在索引中。处理死链时,不要用 robots.txt 代替 404 或 301。
第二,确认站点地图是否仍包含该 URL。站点地图不保证收录,但把已确认失效的 URL 继续留在站点地图中,会浪费抓取预算,也会让后续排查更混乱。确认失效后再移除或替换。
第三,确认 HTTPS 不是判断依据。HTTPS 不保证安全无漏洞或排名,也不能说明脚本请求一定成功。差异定位仍要回到状态码、请求目标和最终 DOM。
若同一现象涉及多个搜索引擎,支持情况须分别核查,不要用单一工具的结果推断所有引擎的表现。
完成上述判断后,交给开发或运维的信息应包含:原始 URL、静态响应状态、脚本执行后的最终 URL、失败请求的 URL 与状态码、复现步骤,以及你建议的处理类型(修复接口、修路由、301、保留 404)。
只有当脚本请求的目标资源确实不存在、且页面没有等价替代内容时,才按死链删除或跳转处理。若静态响应与脚本结果不同但静态内容仍可用,优先修复脚本层,而不是改动 URL 本身。这样处理的直接结果是:你保留了一个仍能提供内容的页面,同时把真正失效的接口或路由暴露出来,后续监控也能落在正确的对象上。