You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 19:15:49