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

大学项目需求:无第三方服务的PHP反向代理搭建方法求教

PHP实现反向代理(多端口功能模块路由)

核心思路

反向代理的核心逻辑就是:接收用户请求 → 根据预设规则转发到对应端口的后端服务 → 把后端响应原样返回给用户。用PHP实现的话,cURL是最实用的工具,能处理GET/POST等各类请求类型,还能灵活控制请求头、响应头的传递。

分步实现

1. 定义功能-端口映射规则

先把各个功能模块对应的端口整理成数组,方便后续快速匹配路由:

$routeMap = [
    '/score' => '127.0.0.1:8080',  // 成绩查询模块
    '/profile' => '127.0.0.1:8081', // 个人信息模块
    '/transcript' => '127.0.0.1:8082', // 成绩单打印模块
];

2. 解析用户请求信息

获取用户的请求路径、方法、参数、请求头等关键信息,确保转发给后端的请求和用户发起的完全一致:

// 获取用户请求路径(剔除域名部分)
$requestPath = $_SERVER['REQUEST_URI'];
$backendHost = null;
$backendPath = '/';

// 匹配对应的后端服务地址
foreach ($routeMap as $prefix => $host) {
    if (str_starts_with($requestPath, $prefix)) {
        $backendHost = $host;
        // 截取后端服务需要的路径(去掉代理的前缀标识)
        $backendPath = substr($requestPath, strlen($prefix)) ?: '/';
        break;
    }
}

// 无匹配路由时返回404
if (!$backendHost) {
    http_response_code(404);
    echo "404 Not Found";
    exit;
}

// 获取请求方法、请求头、请求体
$requestMethod = $_SERVER['REQUEST_METHOD'];
$headers = getallheaders();
$requestBody = file_get_contents('php://input');

3. 用cURL转发请求到后端

配置cURL选项,把用户的请求原样转发到对应端口的后端服务:

$ch = curl_init();

// 拼接后端完整请求URL
$backendUrl = "http://{$backendHost}{$backendPath}";
// 拼接查询参数(如果有)
if (!empty($_SERVER['QUERY_STRING'])) {
    $backendUrl .= '?' . $_SERVER['QUERY_STRING'];
}

// 设置cURL基础选项
curl_setopt($ch, CURLOPT_URL, $backendUrl);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $requestMethod);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_HEADER, true); // 同时获取响应头和响应体

// 处理并转发请求头(排除Host,替换为后端服务的Host)
$curlHeaders = [];
foreach ($headers as $key => $value) {
    if ($key !== 'Host') {
        $curlHeaders[] = "{$key}: {$value}";
    }
}
$curlHeaders[] = "Host: {$backendHost}";
curl_setopt($ch, CURLOPT_HTTPHEADER, $curlHeaders);

// 转发请求体(针对POST/PUT等带内容的请求)
if (!empty($requestBody)) {
    curl_setopt($ch, CURLOPT_POSTFIELDS, $requestBody);
}

// 执行请求并获取结果
$response = curl_exec($ch);
$curlError = curl_error($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
curl_close($ch);

// 处理cURL请求错误
if ($curlError) {
    http_response_code(500);
    echo "Proxy Error: {$curlError}";
    exit;
}

4. 把后端响应返回给用户

拆分响应头和响应体,原样输出给用户:

// 拆分响应头与响应体(两者以两个换行分隔)
$responseHeaders = substr($response, 0, $headerSize);
$responseBody = substr($response, $headerSize);

// 输出后端返回的响应头
foreach (explode("\r\n", $responseHeaders) as $header) {
    if (!empty($header)) {
        header($header);
    }
}

// 设置响应状态码
http_response_code($httpCode);

// 输出响应体内容
echo $responseBody;

关键注意事项

  • 确保PHP的cURL扩展已开启:在php.ini中找到extension=curl,去掉前面的注释后重启Web服务。
  • 后端服务需允许代理服务器IP访问(本地测试用127.0.0.1无需额外配置)。
  • 若后端用HTTPS,测试环境可添加证书跳过验证:curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);,生产环境需配置合法证书。
  • 会话保持:需确保Cookie请求头被正确转发,后端返回的Set-Cookie响应头也完整返回给用户。
  • 超时控制:可添加curl_setopt($ch, CURLOPT_TIMEOUT, 30);避免请求长时间挂起。

内容的提问来源于stack exchange,提问作者codenoob123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 06:18:29