Laravel表单POST提交无响应返回301状态码问题求助
301响应发生在请求到达PHP/Laravel层之前的概率极高,按优先级从高到低排查即可:
第一优先级:检查表单提交地址的尾部斜杠
Laravel注册的POST路由是/login(无尾部斜杠),如果表单action硬编码写成了/login/(带尾部斜杠),Apache/Nginx的默认重写规则会直接在Web服务层返回301,跳转到无斜杠的/login地址,这个过程不会把请求转发给PHP处理,而且跳转时会自动将POST请求转为GET请求,自然不会命中你注册的POST路由,哪怕数据库配置错了也不会抛错。
修正方式:不要硬编码表单action地址,统一用框架提供的路由辅助函数生成,Blade模板中写法参考:<form action="{{ route('login') }}" method="POST">验证方式:打开Chrome开发者工具,点开返回301的那条请求,查看响应头里的
Location字段,如果值是不带斜杠的/login,直接坐实这个问题。第二优先级:检查域名/协议强制跳转规则
如果你的Web服务层(Nginx/Apache)配置了以下跳转规则,同样会在请求到达PHP前返回301,转POST为GET:- HTTP强制跳HTTPS
- 带www域名强制跳不带www(或反向跳转)
验证方式同样是看301响应的Location头,对比你发请求的原地址,看是协议不匹配还是域名前缀不匹配。如果站点挂在CDN、负载均衡等反向代理后面,记得同步修改app/Http/Middleware/TrustProxies.php,将$proxies属性设置为*,避免框架误判请求协议触发跳转。
第三优先级:确认站点根目录配置正确
检查Web服务器的站点根目录是否指向项目下的public文件夹,而非项目根目录。根目录配置错误会导致框架重写规则失效,触发异常301跳转。第四优先级:验证请求是否到达PHP层
先执行命令清理所有缓存,排除缓存配置干扰:php artisan optimize:clear之后在
app/Http/Kernel.php的web中间件组最开头加一行调试代码:dd('请求已到达PHP层');重新发起登录请求,如果页面没有输出上面的调试文字,说明问题完全出在Web服务器配置层面,和Laravel代码、业务逻辑无关,重点查重写规则、目录配置、跳转规则即可;如果能输出调试文字,再逐行往下调试中间件,找到返回301的具体位置。
补充验证:临时加测试路由排除路由注册问题
在routes/web.php最顶部临时加一条测试路由:Route::post('/login-debug', function () { dd('POST请求命中路由'); });写简单表单POST到这个地址,如果还是返回301,直接跳过所有框架内的排查,聚焦Web服务器配置即可。
内容的提问来源于stack exchange,提问作者dangvy

