列表页 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 别用错函数。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
