清理死链不能只删404链接,须先精准识别再分类处置:用pathlib补全相对路径验证本地存在性,HTTP验证需补index.html、检查响应体与Content-Type,并按链接类型区别处理(替换、补全、标记或人工判断)。

不能靠“删掉所有404链接”来清理——HEAD返回404只是表象,真正要处理的是链接是否仍被引用、目标是否存在替代页、路径是否可补全。本地静态站批量清理死链,核心是先精准识别,再分类处置。
用 Python + pathlib 解析相对路径再验证
直接对 href 值发 requests.head() 必然大量误报:./about.html、../js/app.js 这类相对路径不结合 HTML 文件所在目录就发请求,requests 会抛 InvalidURL 或连到错地址。必须用 pathlib.Path 补全:
- 读取每个
.html文件时,用Path(file_path).resolve().parent得到其真实父目录 - 对每个
href,执行Path(parent_dir).joinpath(href).resolve()得到本地绝对路径 - 仅当该路径存在且是文件(
.is_file())时,视为有效;否则才走 HTTP 验证 - 跳过以
#、javascript:、mailto:开头的伪协议链接
HTTP 验证不能只看状态码 200/404
200 不等于可用,404 也不等于真死——这是本地检测最常翻车的地方:
- 对以斜杠结尾的路径(如
/blog/),自动补index.html再试一次 - 对
.html链接,HEAD 返回 200 后,还需GET前 1KB 响应体,检查是否含或 <code>/code>,避免 Nginx 默认 404 页面伪装成 200 - 对
.json、.css、.js等资源,检查响应头Content-Type是否匹配(如application/json),否则可能是服务器兜底返回的 HTML 错误页 - 设置超时(建议
timeout=(3, 5))和重试(最多 2 次),避免因网络抖动误判
清理动作必须按链接类型区分
不是所有死链都该删。盲目正则替换 <a href="..."></a> 会破坏语义、无障碍支持和 SEO 权重传递:
立即学习“前端免费学习笔记(深入)”;
- 内部相对链接(如
./old-page.html):先查 Git 历史或构建产物目录,确认目标是否只是改名/移位;若存在./new-page.html,直接替换href值 - 目录型路径(如
/docs/):优先加index.html补全,其次考虑配置本地服务重写规则(如serve -s build -c rewrite.json) - 外部链接(完整 URL):不自动修改,只记录到
invalid_links.txt,由人工判断是否替换为归档页(如 Wayback Machine)、删除或加rel="nofollow" - 指向已彻底下线内容的链接:保留标签但加
class="dead-link"和aria-label="已下线",既不误导用户,也避免搜索引擎误抓
真正难的不是检测,而是判断“这个链接还该不该存在”。比如一个旧产品页链接失效了,但它仍被三篇外部博客引用,此时修复重点不是删掉它,而是配 301 跳转到新 SKU 页——而这个决策,脚本永远做不了。



















