proxy_set_header Host www.example.com;
# canonical 由应用固定输出主域名,不读 HTTP_HOST
curl -s https://cdn.example.com/post/123/ | grep -o "canonical[^>]*"

站点接了 CDN,模板里的 canonical 跟着当前 Host 走,一部分页面输出 cdn.example.com,后台把 CDN 地址当成正版,主站页面变成副本。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:canonical 取值用了请求头里的 Host,回源和边缘的 Host 不一致时就写错。CDN 域名通常还被 robots 屏蔽,权重落在一个抓不了的地方。

「canonical CDN 域名」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。同一份配置存在多处的,先确认改的是被加载的那一份。

新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

处理上按这个顺序:canonical 固定写主域名,不读 Host;回源时把 Host 透传成主域名;检查 CDN 域名是否被 robots 屏蔽;抽查不同边缘节点的页面源码。

确认没问题再收工,从 CDN 节点打开的页面 canonical 也是主域名,后台不再出现 CDN 地址。

作者 9823189