标签大小写引发的连锁反应:从 sitemap 死链到 git 不改名
起因
sitemap 提交给 Google 之后一直显示「无法抓取」。用 Googlebot 的 UA 去取是 200,干脆把 225 条 URL 全跑一遍,揪出 8 条 404:
/404.html |
/404.html 是另一回事(nginx 里设成了 internal,本来就不该进 sitemap)。先说那 7 个标签页。
目录名对不上
对着服务器挨个查:
sitemap 写 Docker → 服务器上是 docker |
每个都差一层大小写,而且新旧一一对应。
根子在文章的 front-matter。同一个东西,有的写 Docker,有的写 DOCKER,有的写 docker。Hexo 把它们当成三个不同的标签,生成三个目录。
三个目录在本地是同一个
因为我在 Windows 上写博客。
文件名不区分大小写,public/tags/Docker/ 和 public/tags/docker/ 指向同一块地方。构建时后生成的覆盖先生成的,最后只剩一种拼写,git 也就只记录了这一种。
扫了 92 篇、247 处标签引用,6 组冲突,改了 15 个文件 15 处,统一成首字母大写。
重新部署,还是 404
hexo clean 之后重建、hexo deploy,线上照样打不开 /tags/Docker/。
爬上去看目录,还是 DOCKER。
不是部署失败。.deploy_git 那个仓库的索引里记着旧路径 tags/DOCKER/index.html,新构建是 tags/Docker/index.html。Windows 上的 git 也认为这是同一个文件(core.ignorecase 默认开着),于是只更新内容,路径名一个字都没动。
改了大小写,但传不到 Linux 服务器上。
换一个干净的索引推
.deploy_git 是 hexo-deployer-git 自己维护的,没去碰它。直接拿构建产物新建一个仓库推上去:
D=$(mktemp -d) |
git init 出来是空索引,路径按实际大小写记录,推上去服务器就对了。
还有一步不能省
hexo clean。
不清的话 public/ 里旧的大小写目录还在,和新目录继续打架,谁覆盖谁看运气。
结果
7 个标签页恢复。sitemap 从 225 条降到 217 条——不是少了内容,是 6 组重复标签合并了。线上全量跑一遍,0 死链。
一个标签拼错三个写法,最后要动到 git 索引才能修好。这种东西不上线是发现不了的。
