<?php
header('Access-Control-Allow-Origin: *'); // 允许所有来源的请求访问资源，如需精准指定前端域名把 * ，改为域名即可
header('Access-Control-Allow-Methods: *'); // 允许所有的 HTTP 方法，可将 * 替换成这些(全部替换)：GET, POST, PUT, DELETE, OPTIONS
header('Access-Control-Allow-Headers: *'); // 允许所有的请求头，可将 * 替换成这些(全部替换)：Content-Type, Authorization, X-Requested-With
header('Access-Control-Allow-Credentials: true'); // 允许跨域请求携带 Cookie

// 如果是 OPTIONS 请求（浏览器发送的预检请求）
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(200); // 返回状态码 200
    exit; // 返回 200 状态码，且终止脚本执行
}

// 获取请求的 URI，去除代理脚本部分，得到实际的 API 路径
$requestUri = $_SERVER['REQUEST_URI'];
$apiPath = preg_replace('/^\/[^\/]+\/proxy\.php/', '', $requestUri); // 去掉任意前缀的 '/proxy.php'，，得到实际请求路径

// 初始化 cURL 请求
$ch = curl_init();
$targetUrl = 'http://localhost:20638' . $apiPath; // 设置目标 URL，即 Artalk 后端 API 的地址，修改端口即可，其他不要动！
curl_setopt($ch, CURLOPT_URL, $targetUrl);

//存储响应头的变量
$responseHeaders = [];
curl_setopt($ch, CURLOPT_HEADERFUNCTION,
    function($curl, $header) use (&$responseHeaders) {
        $len = strlen($header);
        $header = explode(':', $header, 2);
        if (count($header) < 2) return $len;
        $name = strtolower(trim($header[0]));
        $value = trim($header[1]);
        if ($name === 'content-type') { // 捕获 Content-Type
            $responseHeaders['content-type'] = $value;
        }
        return $len;
    }
);

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $_SERVER['REQUEST_METHOD']); // 设置 HTTP 方法，使用客户端的请求方法（GET, POST, PUT, DELETE 等）

// 处理文件上传（multipart/form-data）
if (!empty($_FILES)) {
    $postData = [];
    foreach ($_FILES as $key => $file) {
        $postData[$key] = new CURLFile($file['tmp_name'], $file['type'], $file['name']);
    }
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
} else {
    // 处理普通 JSON 请求
    $input = file_get_contents('php://input');
    curl_setopt($ch, CURLOPT_POSTFIELDS, $input);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Content-Type: application/json',
        'Authorization: ' . ($_SERVER['HTTP_AUTHORIZATION'] ?? '')
    ]);
}

curl_setopt($ch, CURLOPT_COOKIE, $_SERVER['HTTP_COOKIE'] ?? ''); // 传递客户端(前端评论插件)的 Cookie 到后端
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 设置 cURL 返回结果，而不是直接输出
$response = curl_exec($ch); // 执行 cURL 请求并获取响应

/* //可选功能(没啥用)
 检查 cURL 请求是否成功
if ($response === false) {
    // 如果请求失败，返回错误信息
    $error = curl_error($ch);
    http_response_code(500); // 设置服务器错误状态码
    echo json_encode(['error' => 'cURL error: ' . $error]);
    curl_close($ch);
    exit;
}
*/ //如需使用删除两头（/*和*/）

$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); // 获取 HTTP 响应码

// 自动设置 Content-Type
if (isset($responseHeaders['content-type'])) {
    header('Content-Type: ' . $responseHeaders['content-type']);
}

// 返回响应内容和相应的 HTTP 状态码
http_response_code($httpCode);
echo $response;

// 关闭 cURL 资源
curl_close($ch);
?>