Invalid Form Key. Please refresh the page 表示提交的 Form Key 与当前 Session 不匹配,或者字段根本没有到达 PHP。先判断是所有表单都失败、只有某个管理员失败,还是只有字段很多的商品/配置表单失败。
浏览器中对比表单值与 Session
在 Network 里打开失败 POST,确认 Form Data 中存在 form_key,请求同时带有后台 Session Cookie。再看响应前是否发生域名或 http/https 跳转。不要把真实 Cookie 或 Form Key 发到公开日志。
只有大表单失败,先查 max_input_vars
php -i | grep max_input_vars
php-fpm -i | grep max_input_vars
nginx -T | grep client_max_body_size
商品属性、Bundle 选项或系统配置字段很多时,PHP 超过 max_input_vars 会截断后面的字段,form_key 若位于被截断部分就会报错。以 PHP-FPM 配置为准,适度提高并重载 FPM,然后检查 PHP 日志是否还有 Input variables exceeded 提示。
所有表单都失败,检查 Session
grep -n "session" app/etc/env.php
redis-cli -h SESSION_REDIS ping
redis-cli -h SESSION_REDIS info clients
redis-cli -h SESSION_REDIS info memory
多 Web 节点使用本地 Session、Redis 不稳定、Cookie Domain/Path 错误,都会让 GET 页面和 POST 请求落在不同 Session。固定访问单节点后恢复,是共享 Session 问题的重要证据。
后台页面绝不能被 CDN/FPC 缓存
curl -skI https://admin.example.com/admin/catalog/product/
检查 Age、X-Cache、Cache-Control 与 Set-Cookie。后台 HTML 若被共享缓存,用户会拿到过期 Form Key。CDN 和 Varnish 应绕过后台路径、带后台 Session Cookie 的请求及 POST。
自定义表单要正确生成和验证 Form Key
<input type="hidden"
name="form_key"
value="<?= $block->escapeHtmlAttr($block->getFormKey()) ?>" />
后台控制器通常应实现相应 HTTP/CSRF 接口并使用 Magento 表单机制。不要通过全局关闭 CSRF 验证来解决报错;这会把管理操作暴露给跨站请求。
Session 过期属于另一种情况
编辑页面打开数小时后提交失败,可能只是管理员 Session 已过期。应用可以给出清晰提示并保留未提交内容,但不应无限延长后台 Session。修复后分别测试普通表单、大商品表单、多节点和长时间停留,确认安全校验仍然有效。
检查 PHP 是否真的收到完整 POST
在受控环境记录 count($_POST)、Content-Length 和是否存在 form_key,不记录具体字段值。浏览器表单有 form_key、PHP 却没有,说明请求大小、变量数量或代理解析阶段截断;PHP 已收到但验证失败,才回到 Session/Cookie 链路。
多个后台标签页的边界
管理员退出再登录后,旧标签页仍保留旧 Form Key,提交自然失败。用新标签验证并提示用户重新加载,但不能把所有 Invalid Form Key 都归咎于多标签页。若新打开页面立即失败,继续检查共享缓存和 Session。
修复 max_input_vars 后再次保存同一复杂商品,并确认没有字段静默丢失;只是不再报 Form Key,并不能证明所有属性都被 PHP 接收。

