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

服务器迁移后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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 10:54:51