Nginx配置全量请求转发至index.php后POST请求$_POST为空如何解决
问题解决方案
排查步骤1:修复表单缺失的name属性
你的表单内的input标签仅设置了id属性,没有设置name属性,浏览器提交表单时只会携带带有name属性的表单参数,这是$_POST为空最常见的原因,修改表单代码如下:
<form class="form-signin text-center" action="/login-post" enctype="multipart/form-data" method="post" style="max-width: 400px"> <h1 class="h3 mb-3 font-weight-normal">Please sign in</h1> <!-- 新增name属性 --> <input type="email" name="email" id="inputEmail" class="form-control" placeholder="Email address" required autofocus> <!-- 新增name属性 --> <input type="password" name="password" id="inputPassword" class="form-control" placeholder="Password" required> <div style="width: 100%; display: flex; align-content: end; flex-direction: row-reverse;"> <button class="btn btn-lg btn-primary btn-block" style="width: 100px" type="submit">Sign in</button> </div> <p class="mt-5 mb-3 text-muted">© 2017-2018</p> </form>
排查步骤2:修复Nginx配置问题
你当前的Nginx try_files规则存在两个可能导致POST数据丢失的问题:
- 没有传递请求参数,且可能触发自动跳转丢失POST数据
修改你的location块配置为:
location / { try_files $uri $uri/ /index.php$is_args$args; }
- 检查是否存在路径自动跳转:
通过浏览器开发者工具的「网络」面板查看表单提交后的请求状态码,如果返回301/302跳转,说明Nginx将/login-post自动跳转到了带斜杠的/login-post/,跳转过程中浏览器会自动将POST请求转为GET请求,导致POST数据丢失。
解决方案:
- 要么将路由匹配规则改为
case '/login-post/': - 要么在Nginx配置中关闭对应路径的自动加斜杠规则,或者新增重写规则避免跳转:
rewrite ^/login-post$ /index.php last;
排查步骤3:验证PHP请求接收情况
如果上述步骤都无法解决问题,可通过以下方式验证:
在/login-post的路由逻辑中新增代码打印原始请求体:
case '/login-post': // 打印原始请求体 var_dump(file_get_contents('php://input')); print_r($_POST); break;
- 如果原始请求体有数据,说明PHP已经接收到请求,问题出在
$_POST解析环节,可检查php.ini中post_max_size配置是否小于提交的数据大小,或者是否有前置脚本清空了$_POST变量 - 如果原始请求体为空,说明请求在到达PHP前就已经丢失了数据,可进一步检查Nginx的fastcgi参数配置,确认是否正确传递了请求体。
内容的提问来源于stack exchange,提问作者HashtagForgotName
相关产品推荐
相关产品推荐

