分类从 /men/shoes 改成 /shoes,开启“为旧URL创建永久重定向”后,浏览器提示重定向次数过多。curl跟踪发现旧地址301到新地址,新地址又被某条历史重写或Nginx规则301回旧地址。只清缓存不会改变url_rewrite表里的关系。

先把跳转链完整打印出来

curl -sS -I https://example.com/men/shoes
curl -sS -IL --max-redirs 10 https://example.com/men/shoes | grep -iE 'HTTP/|location:'

分别请求是否带尾斜杠、是否带.html、HTTP与HTTPS、www与非www,避免把域名规范化循环误判成Magento分类循环。

查询两个request_path的记录

SELECT url_rewrite_id,entity_type,entity_id,request_path,target_path,redirect_type,store_id,is_autogenerated
FROM url_rewrite
WHERE request_path IN ('men/shoes','shoes')
   OR target_path IN ('men/shoes','shoes')
ORDER BY store_id,url_rewrite_id;

系统生成的旧URL重定向通常request_path=旧路径、target_path=新路径、redirect_type=301。若还存在request_path=新路径指回旧路径的自定义记录,就形成闭环。多Store下同一路径可各有一条,查错store_id会以为数据没有问题。

再检查Web服务器和扩展

  • Nginx/Apache是否有旧SEO迁移规则
  • CDN Redirect Rule是否把新路径改回旧路径
  • SEO扩展是否维护独立的redirect表
  • Store Code加入URL后是否重复拼接或剥离
  • 尾斜杠规则是否与Magento suffix规则打架

用响应Header判断每一跳由哪一层产生。Magento跳转通常带应用层特征;CDN或Nginx可能在请求到达PHP前完成。

安全修复方式

先导出涉及entity_id和store_id的重写记录。删除或禁用那条错误的自定义反向重定向,保留旧到新的单向301。对于大量脏数据,优先修正生成来源后重建URL Rewrite;不要每天用SQL删表。

bin/magento indexer:reindex catalog_url
bin/magento cache:clean full_page

部分Magento 2版本没有独立catalog_url索引器,以 indexer:info 为准。修改分类URL key并保存,也会触发对应重写生成。

SEO验证清单

  • 旧URL只跳一次并最终200
  • 新URL直接200,不再返回301
  • canonical指向新URL
  • Sitemap只包含新URL
  • 各Store View跳转到自己的域名和路径
  • 带查询参数的旧链接按需要保留参数但不形成循环
修301循环时不要一上来关闭所有旧URL重定向。正确目标是保留单向迁移链,而不是让历史外链全部404。