英文站、中文站页面内容和域名都不同,但查看源代码,canonical全部指向主站。先判断canonical来自Magento核心产品或分类配置、SEO扩展还是主题模板;多个来源同时输出时还会出现两条canonical。

从HTML反查生成者

grep -R "rel=.canonical\|addRemotePageAsset\|canonical_url" app/code app/design vendor -n

浏览器Elements里看到的标签可能被JS后插入,SEO审计要以服务器返回的HTML为准。用curl分别请求两个域名并比较:

curl -s https://en.example.com/product.html | grep -i canonical
curl -s https://cn.example.com/product.html | grep -i canonical

核对每个Scope的Base URL

bin/magento config:show web/secure/base_url --scope=stores --scope-code=en_store
bin/magento config:show web/secure/base_url --scope=stores --scope-code=cn_store

在后台切到具体Website或Store View保存,不要只改Default Config。确认Nginx按Host设置正确的MAGE_RUN_CODE与MAGE_RUN_TYPE。

自定义代码常犯的错

Cron或Block里用默认StoreManager获取Base URL,或做store emulation后没有在finally中stopEnvironmentEmulation,后续请求就可能沿用错误Store。生成canonical时使用当前页面的Store与URL Rewrite,不要硬编码主域名。

缓存层也必须按域名隔离

检查Varnish hash包含Host,CDN缓存键也要区分Host与必要的Store cookie。若两个域共用缓存键,先访问主站的人会把带主域canonical的HTML缓存给其他站。清理修复前缓存并逐域预热。

验收不只看首页

  • 两个Store的同一商品;
  • 分类分页和筛选参数;
  • 带URL rewrite的旧地址;
  • 缺少翻译而回退默认内容的页面;
  • sitemap中的URL与canonical一致;
  • 页面只存在一条canonical。

若使用hreflang,同时确认每个alternate URL能返回200并自指正确canonical,避免搜索引擎收到互相矛盾的信号。