列表页 canonical 带筛选参数,输出时被转义成 &,蜘蛛解析出的地址多了一个 amp; 前缀,抓过去返回 404,整批列表页失去规范信号。

一开始怀疑是「参数拼接时没走 esc_url,转义了两次」,查了一圈,方向不对。

这类报错背后常见的原因有几处,逐个排除就行。模板对 URL 做了 HTML 转义,& 变成 &。另一种情况是浏览器能容错,蜘蛛按字面解析。

还有一种情况,页面里同时存在正确和转义两条地址。

先看 canonical 的实际输出

curl -s "https://www.example.com/list/?a=1&b=2" | Select-String canonical

接着改用 esc_url 输出地址

echo '<link rel="canonical" href="'.esc_url($url).'">';

随后确认页面里没有 amp; 残留

curl -s https://www.example.com/list/ | Select-String "amp;"

提交修正后的地址

curl -s "https://www.google.com/ping?sitemap=https://www.example.com/sitemap.xml"

这台环境是别人交接的,不少默认值被动过,只能一项项核。

同事提醒我看一下最近一次发布,时间点确实对得上。

别只看报错消失,验证要多做一步。canonical 里是原始的 &,抓取该地址返回 200,索引里的规范网址不再指向 404。

容易忽略的是,esc_url 会保留 &,esc_html 才会转成 &,canonical 别用错函数。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189