PHP CURL POST请求至Nginx API未接收POST数据问题排查
问题:POST请求数据未被PHP后端接收的原因排查
现象:GET请求可正常访问Nginx部署的API,但使用PHP CURL发送POST请求时,Nginx日志显示返回200状态码且无令牌错误,后端api.php却无法获取POST数组,返回结果为ok=>0。
核心原因分析
1. PHP $_POST数组的接收限制
PHP的$_POST数组仅会自动解析**Content-Type为application/x-www-form-urlencoded或multipart/form-data**的请求体。而你的CURL请求明确设置了Content-Type: application/json,这种情况下PHP不会将JSON格式的请求体填充到$_POST中,导致empty($_POST)判断为真,返回ok=>0。
2. Nginx配置并非主要问题
当前Nginx虚拟主机配置中的rewrite ^/api/b1/([^/]+)/([^/]+)/?$ /api.php?data1=$1&data2=$2? last;规则末尾的?用于截断原有查询参数,但POST请求的请求体不受该规则影响。auth_request指令默认会缓存并转发POST请求体到后端,因此Nginx配置不是导致POST数据无法接收的直接原因。不过可以优化配置顺序,将rewrite放在try_files之前,避免try_files提前匹配到静态文件而跳过重写规则:
location /api/b1/ { auth_request /_validate_apikey; rewrite ^/api/b1/([^/]+)/([^/]+)/?$ /api.php?data1=$1&data2=$2? last; try_files $uri $uri/ /api.php?$args; }
解决办法
方法一:后端修改JSON数据接收方式
直接读取原始请求体并解析JSON,替代依赖$_POST的逻辑:
$rawJson = file_get_contents('php://input'); $postData = json_decode($rawJson, true); // 调整判断逻辑 if(!empty($postData)) { $json = array("ok"=>1); } else { $json = array("ok"=>0); }
方法二:修改CURL请求的Content-Type(不推荐,若API设计为JSON接收)
如果希望继续使用$_POST,需将CURL的请求格式改为表单编码,同时修改Content-Type:
// 若原$array是关联数组,直接转成表单格式 $formData = http_build_query($array); $ch = curl_init($server.'/'.$data1.'/'.$data2); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_POSTFIELDS, $formData); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/x-www-form-urlencoded', 'X-API-KEY: '.$token) ); $result = curl_exec($ch); curl_close($ch); $api = json_decode($result, true);
内容的提问来源于stack exchange,提问作者WOLFNeT
相关产品推荐
相关产品推荐

