起因

sitemap 提交给 Google 之后一直显示「无法抓取」。用 Googlebot 的 UA 去取是 200,干脆把 225 条 URL 全跑一遍,揪出 8 条 404:

/404.html
/tags/Docker/ /tags/DOCKER/ /tags/Java/
/tags/kotlin/ /tags/python/ /tags/hexo/ /tags/nginx/

/404.html 是另一回事(nginx 里设成了 internal,本来就不该进 sitemap)。先说那 7 个标签页。

目录名对不上

对着服务器挨个查:

sitemap 写 Docker  → 服务器上是 docker
sitemap 写 Java → 服务器上是 JAVA
sitemap 写 kotlin → 服务器上是 Kotlin

每个都差一层大小写,而且新旧一一对应。

根子在文章的 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)
cp -r public/. "$D"/
cd "$D"
git init -q && git add -A
git commit -q -m "deploy"
git push -f ubuntu@server:/var/repo/cykBlog.git HEAD:master

git init 出来是空索引,路径按实际大小写记录,推上去服务器就对了。

还有一步不能省

hexo clean。

不清的话 public/ 里旧的大小写目录还在,和新目录继续打架,谁覆盖谁看运气。

结果

7 个标签页恢复。sitemap 从 225 条降到 217 条——不是少了内容,是 6 组重复标签合并了。线上全量跑一遍,0 死链。

一个标签拼错三个写法,最后要动到 git 索引才能修好。这种东西不上线是发现不了的。