先别改内链,先把“工具成功、用户失败”拆成可复现的三层条件:请求身份、请求路径、页面运行时。拿你手上那条失败的内链,记录工具请求的User-Agent、IP来源、是否执行JavaScript、是否携带Cookie与登录态,再用真实用户环境逐项对照。只要有一层不同,工具的成功就不能证明用户可达。下一步是构造一个最小对照请求,让差异只保留一个变量,直到失败稳定出现。
选一条具体内链,例如从栏目页指向详情页的链接,或从详情页指向相关内容的链接。记录四个字段:源页面URL、目标URL、链接在HTML中的位置、失败时的表现(404、超时、跳登录、内容为空)。这些字段决定后面能改什么。
如果只记录“用户说打不开”,复现会一直漂移。把失败表现写清楚,才能判断问题在服务端响应、前端渲染还是权限判断。
工具能访问,通常是因为它和真实用户至少有一项不同。按下面顺序核对,先查最可能造成分叉的项:
假设一条内链在工具中返回200,但用户在手机浏览器点击后进入登录页。对照后发现工具携带了测试账号Cookie,而用户是匿名访问。此时问题不在链接地址,而在权限与跳转规则。动作是去掉Cookie重放同一请求;如果匿名请求被302,就说明这条内链对未登录用户不可达,需要改链接目标或调整访问规则,而不是继续检查URL拼写。
复现的目标不是“证明工具错了”,而是让失败在受控条件下稳定出现。做法是从工具的成功请求出发,每次只改一项,观察哪一项改完后结果翻转。
例如工具请求为:
GET /detail/123 HTTP/1.1
User-Agent: ToolBot
Cookie: session=test
第一步去掉Cookie,保留ToolBot的UA;第二步换回真实用户UA,保留匿名状态;第三步关闭脚本执行。每一步记录状态码、最终URL和正文是否包含目标内容。翻转发生的那一步,就是需要优先处理的差异。
如果去掉Cookie后仍然200,但关闭JavaScript后正文为空,那么失败原因在渲染层,不在服务端可达性。此时要检查链接是否写在脚本生成的DOM里,以及用户浏览器是否因脚本报错而没渲染出链接。
内链要成立,至少经过四关:服务端返回可达、HTML里存在可抓取的链接、用户能点击、点击后目标页对当前用户可见。工具通常只验证前两关,用户失败往往发生在后两关。
这四关不能互相替代。工具返回200,不能证明用户能看到内容;用户看不到内容,也不能直接推断服务端不可达。
复现完成后,按差异类型决定动作,而不是按“工具说成功”或“用户说失败”站队。
每次动作后,回到最初的四字段记录,确认失败表现是否改变。如果状态码、最终URL或正文内容有任何一项变化,就说明变量已生效,下一步应继续缩小剩余差异,而不是直接宣布修复。
上面的方法适用于你能拿到失败样本、能控制请求变量的场景。如果失败只出现在无法复现的个别用户、无法获取其网络与会话信息,或者页面依赖第三方脚本且你无法干预加载顺序,那么最小复现会受限。此时应优先收集失败时的截图、时间、网络类型和登录状态,再判断是否值得继续投入。
另外,工具返回成功不等于搜索引擎会收录或用户会点击;robots.txt的抓取限制也不等于可靠的索引移除。复现解决的是“为什么用户失败”,不是“如何保证收录或排名”。把这两件事分开,才不会用错误的成功信号掩盖真实问题。