<?php $canonical = get_permalink(); ?>
<link rel="canonical" href="<?php echo esc_url($canonical); ?>">
<!-- 不要写成 href="/post/123/" -->

站点装在 /blog 子目录,canonical 写的是 /post/123/,浏览器打开正常,抓取工具解析出来的却是 https://example.com/post/123/。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:相对地址按当前文档的基准解析,子目录会被丢掉,拼出来的地址落在根域。根域没有这篇内容,返回 404,canonical 指向失效。

「canonical 相对路径」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。监控和日志的时间要对上,时区不一致会多绕很大一圈。

临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

处理上按这个顺序:canonical 统一输出绝对地址,带协议和主机;用 home_url 或 get_permalink 生成,不要手拼;检查 head 里有没有 base 标签干扰解析;逐个目录抽查解析后的地址。

确认没问题再收工,抓取工具里显示的 canonical 与文章真实地址一致,不再落到根域 404。

作者 9823189