服务器迁移后PHP内部POST请求失效问题求助
同服务器POST请求失效(大尺寸数据触发)问题
问题背景
从旧服务器(CentOS 8 + cPanel WHM + PHP 8.1)迁移代码到新服务器(CentOS 8 + CyberPanel + PHP 8.1)后,出现以下异常:
- GET请求完全正常
- 向外部服务器发送POST请求正常
- 向同服务器内部API端点发送POST请求时失效,curl发送的POST数据无法被端点接收
- 进一步调试发现:当POST数据长度≤1024字节时请求正常;数据长度超过1024字节(比如包含invoice变量中mail/sms的text字段)时,请求直接失效
使用的API调用函数
function CallAPI($method = "GET", $url = "", $data = false, $credentials = "") { try { if (isset($url) && !empty($url)) { $curl = curl_init(); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method); if (!empty($credentials)) { curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($curl, CURLOPT_USERPWD, $credentials); } if ($method === "POST" || $method === "PUT") { curl_setopt($curl, CURLOPT_POSTFIELDS, $data); curl_setopt($curl, CURLOPT_HTTPHEADER, ['Content-Type: application/x-www-form-urlencoded']); } else if ($method === "GET") { $url = sprintf("%s?%s", $url, http_build_query($data)); } curl_setopt($curl, CURLOPT_TIMEOUT, 60); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); $response = curl_exec($curl); if ($response === false) { throw new Exception("cURL error: " . curl_error($curl)); } $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); curl_close($curl); if ($httpCode < 200 || $httpCode >= 300) { throw new Exception("HTTP error: " . $httpCode); } return $response; } else { return false; } } catch (Exception $e) { // error_log("Error in CallAPI: " . $e->getMessage()); return false; } }
调试用的接收端点脚本
<?php $response['status'] = "OK"; $data = !empty($_POST) ? $_POST : file_get_contents("php://input"); if (!empty($data)) { $phpArray = json_decode($data, true); $response['message'] = 'Data received successfully'; $response['data'] = $phpArray; } $response['status'] = 'Endpoint successfully reached.'; $response['method'] = $_SERVER['REQUEST_METHOD']; $response['rawdata'] = $data; echo json_encode($response); exit; ?>
已尝试的无效操作
- 确认PHP及cURL扩展正常安装
- 从外部服务器向新服务器发送POST请求(正常,排除端点本身问题)
- 调整php.ini的
post_max_size参数 - 使用
htmlentities+json_encode处理POST数据
针对性解决方案
1. 检查OpenLiteSpeed的请求限制(CyberPanel核心问题)
CyberPanel默认使用OpenLiteSpeed,其默认配置可能对大尺寸本地请求有拦截:
- 登录CyberPanel,进入对应网站的
LiteSpeed Web Server设置面板 - 找到Tuning选项,修改
Max Request Body Size为足够大的值(如64M) - 同时检查
Request Timeout,设置为60秒以上避免超时 - 执行命令重启OpenLiteSpeed:
systemctl restart lsws
2. 修复curl请求的Content-Type与参数格式
如果你的$data是JSON字符串而非键值对数组,当前代码的Content-Type: application/x-www-form-urlencoded会导致端点无法解析数据,尤其是大尺寸JSON:
// 修改POST/PUT分支的代码: if ($method === "POST" || $method === "PUT") { // 判断数据类型,自动设置正确的Content-Type if (is_array($data)) { curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data)); curl_setopt($curl, CURLOPT_HTTPHEADER, ['Content-Type: application/x-www-form-urlencoded']); } else { curl_setopt($curl, CURLOPT_POSTFIELDS, $data); curl_setopt($curl, CURLOPT_HTTPHEADER, ['Content-Type: application/json']); } }
同时添加curl的本地请求优化选项:
// 在curl_init后添加 curl_setopt($curl, CURLOPT_FRESH_CONNECT, true); // 禁用连接复用,避免本地缓存问题 curl_setopt($curl, CURLOPT_SEND_BUFFER_SIZE, 8192); // 增大发送缓冲区
3. 补充PHP配置检查
除了post_max_size,还需确认以下参数:
upload_max_filesize: 设置与post_max_size一致(如64M)max_input_time: 设置为60或更高max_input_vars: 如果POST数据是复杂多维数组,提高到10000以上
4. 排查LiteSpeed的安全策略
- 临时关闭对应网站的
ModSecurity功能,测试是否恢复正常(若正常则需调整ModSecurity规则) - 检查服务器
/etc/hosts文件,确保本地域名解析指向127.0.0.1,避免通过公网IP请求触发的防火墙/限速规则
内容的提问来源于stack exchange,提问作者Quatban Taco
相关产品推荐
相关产品推荐

