404错误表示服务器收到请求但无法找到对应资源,需通过network面板确认状态码并区分真/假404、软404及临时故障;修复须按资源可控性选择替换、重定向、降级或移除策略。

外链变成 404,不是改一两个 href 就能解决的事。它本质是目标资源已不可达,修复动作必须分清“还能救”和“已经死”,否则白改。
怎么判断外链是真失效还是临时不可达
直接访问那个外链地址,看浏览器返回的到底是不是 404。但别只信页面文字——打开开发者工具的 Network 面板,确认状态码确实是 404,而不是 403(权限拒绝)、503(服务暂时不可用)或跳转到错误页后的二次 404。
- 如果返回
403或401:说明资源还在,只是加了访问限制,你无法绕过,只能换源或联系对方开放 - 如果返回
503或超时:可能是对方服务器临时宕机或限流,等几小时再试,或加个降级逻辑(比如 fallback 图片、备用链接) - 如果返回
404且多次验证一致:基本可判定资源已下线,进入下一步处理
替换外链前先确认是否被缓存或 CDN 干扰
有些外链看似 404,实则是本地缓存了旧响应,或 CDN 节点还没刷新。用无痕窗口访问,或加时间戳参数强制绕过缓存,例如把 https://cdn.example.com/lib.js 改成 https://cdn.example.com/lib.js?v=20261010。
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
- 对
<script></script>和<link rel="stylesheet">标签,加v=参数最简单有效 - 对
<img src>,部分 CDN 对HEAD请求返回404但GET正常,htmlproofer 默认发HEAD,会误报;可加--http-status-ignore 0并设--timeout 10避免假死 - 若外链带
file:///或未启动的localhost:3000,htmlproofer 会直接退出,必须用--url-ignore "/^file:\/\//,/^http:\/\/localhost/"
替换策略取决于外链类型和控制权
你对外链有没有修改权限,决定了你能走哪条路:
- CDN 上的公共库(如 jQuery、Bootstrap):查官网最新地址,换为官方推荐的
https://cdn.jsdelivr.net/npm/或https://unpkg.com/地址,别硬写死旧版本路径 - 合作方 API 或图片资源:联系对方确认新地址,或协商保留旧路径做 301 重定向;没响应就考虑本地托管关键资源(注意版权和更新同步)
- 用户生成内容里的外链(如评论中的图片):不能改源,只能前端拦截 + fallback,例如用
onerror回调加载占位图:<img src="xxx.jpg" onerror="this.src='/fallback.png'"> - Markdown 或 CMS 中插入的外链:优先用相对路径或站内路径替代;若必须外链,加一层代理接口做可用性兜底(如
/proxy?url=https%3A%2F%2Fxxx.com%2Fimg.png)
htmlproofer 扫描时怎么避免误判外链
htmlproofer 是唯一能真实发起 HTTP 请求的 CLI 工具,但它默认行为容易漏掉关键细节:
- 锚点链接(如
#section1)默认被当失效链,必须显式加--allow-hash-href - 不加
--url-ignore时,遇到file://或本地开发地址会中断扫描 - 某些静态站点生成器输出的
href="/blog/"在本地预览时会 404,因为没运行服务器;这种属于环境问题,不是链接本身坏,应排除在扫描范围外 - 扫描结果里看到大量外链 404,先按域名聚合,集中处理同一来源(比如全来自
old-cdn.com),比逐个修更高效
真正麻烦的不是找到 404,而是发现一堆外链指向同一个已关闭的博客平台或小众图床——这时候你得决定:是批量替换成本地资源,还是加监控告警,或者干脆删掉那块内容。没人替你做这个权衡,工具只负责告诉你“它不在了”。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










