后台改商品时遇到过一个很怪的问题:页面没有明确报错,保存后内容还是旧的,日志里只有 No data to save。刚开始一直盯着商品 Repository 和插件,后来才发现代码根本没机会处理表单数据——保存请求先返回了 301,浏览器跟着跳到新地址时,POST body 已经没了。
不看页面提示,先在Network里找catalog/product/save
正常保存大致会看到这几步:
catalog/product/validate 200
catalog/product/save 302
catalog/product/edit 200
出问题时则是:
catalog/product/save 301
catalog/product/save 302
第二次 save 已经变成重定向后的请求,没有原来的表单数据,所以 Magento 才说没有数据可保存。这个现象和 PHP 的 post_max_size 超限不一样;超限时通常能看到请求大小异常,而这里最明显的证据就是多出来的 301。
顺着Location头查是谁改了后台地址
点开 301 响应,看 Location 到底多了什么。常见情况是少了 Store Code、HTTP 被强制跳到 HTTPS,或者反向代理传进来的 Host 与后台 Base URL 不一致。
如果启用了 Add Store Code to URLs,还要检查 Web Server / Nginx 配置是否把后台请求重写到了另一个不带 Store Code 的地址。站点放在负载均衡后面时,再确认代理有没有正确传递:
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
不要先改 Product Save 控制器。先把保存请求的最终 URL 调整成一次就能命中的地址,再清配置缓存并重新登录后台。Network 中 catalog/product/save 直接返回 302,商品内容也能重新读出来,这个问题才算处理完。

