表单提交到旧地址,页面跳到新地址之后字段全空了,服务端日志里只剩一条 GET 请求,参数一个都没能带过去。日志里能对上时间点,这种反而好排。
301 和 302 都会让浏览器把 POST 改成 GET,请求体在跳转的那一步就被丢掉了,后端当然收不到任何字段,用户辛辛苦苦填的内容全白费,只能重填。这一点先确认清楚,后面就不用反复试。
curl -sI -X POST https://example.com/f | grep -i '^HTTP' # 307 才会保留 POST return 307 https://example.com/new-form;
围绕「301 丢失请求体」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
报错里带路径的,先去看那个路径在不在、权限对不对。
处理上按这个顺序:把表单的 action 直接指向最终地址,从源头绕开这一次跳转;确实要跳转的用 307 或者 308,只有这两个状态码会保留请求方法;跳转之后从会话里面补回提交内容,别让用户再重新填一遍。
结果对不对很好判断,提交后服务端日志里是 POST,收到的字段数量和表单里完全一致。
