美文网首页
php服务器中继代理前端api

php服务器中继代理前端api

作者: 王宣成 | 来源:发表于2023-11-01 16:19 被阅读0次
<?php
// 允许跨域访问
header("Access-Control-Allow-Origin: http://localhost:19006");
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");

// 设置允许携带凭据(credentials)跨域访问
header("Access-Control-Allow-Credentials: true");

// 获取请求方法
$method = $_SERVER['REQUEST_METHOD'];

// 获取前端请求的 Content-Type
$requestContentType = isset($_SERVER["HTTP_CONTENT_TYPE"]) ? $_SERVER["HTTP_CONTENT_TYPE"] : '';

// 获取目标URL,替换域名
$url = 'http://test.com' . $_SERVER['REQUEST_URI'];

$url = str_replace($_SERVER['SCRIPT_NAME'], '', $url);

// 获取所有的请求头
$requestHeaders = array();
foreach ($_SERVER as $key => $value) {
    if (substr($key, 0, 5) === 'HTTP_') {
        $headerKey = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($key, 5)))));
        if($headerKey == 'Content-Type'){
            $requestHeaders[] = $headerKey . ': ' . $value;
        }
        if($headerKey == 'Accept-Language'){
            $requestHeaders[] = $headerKey . ': ' . $value;
        }
    }
}

// 初始化cURL会话
$ch = curl_init($url);

// 根据请求方法设置cURL选项
if ($method === 'POST') {
    // 获取请求体数据
    $data = file_get_contents('php://input');
    if (!empty($data)) {
        curl_setopt($ch, CURLOPT_POST, 1);
        // 根据前端请求的Content-Type设置适当的请求头
        // curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: ' . $requestContentType));

        // curl_setopt($ch, CURLOPT_HTTPHEADER, [$requestHeaders[2],$requestHeaders[3]]);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $requestHeaders);

        // 设置请求体
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    } else {
        // 请求体为空,返回错误或适当的响应
        http_response_code(400); // Bad Request
        exit('Empty request body');
    }
}

// 设置其他cURL选项
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true); // 返回头部信息

curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');

// 执行cURL请求
$response = curl_exec($ch);

// 检查cURL是否出错
if (curl_errno($ch)) {
    // 处理cURL错误,返回适当的响应
    http_response_code(500); // Internal Server Error
    echo 'cURL error: ' . curl_error($ch);
    exit;
}

// 关闭cURL会话
curl_close($ch);

// 分离响应头和响应体
list($header, $body) = explode("\r\n\r\n", $response, 2);

// 提取并设置Cookie
preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $header, $matches);
$cookies = array();
foreach ($matches[1] as $item) {
    parse_str($item, $cookie);
    $cookies = array_merge($cookies, $cookie);
}

// 设置Cookie
foreach ($cookies as $name => $value) {
    setcookie($name, $value, time() + 86400, '/', 'localhost'); // 这里可以根据需要调整cookie的过期时间和路径
}

// 输出响应
echo $body;

相关文章

  • php解析器 , 和内核/引擎的关系

    php解析器 = php API + ZEND + ext php 构成 + 外部关系 反向代理(Reverse ...

  • Vue项目devServer.proxy代理配置详解

    如果你的前端应用和后端 API 服务器没有运行在同一个主机上,你需要在开发环境下将 API 请求代理到 API 服...

  • 教你怎么快速搭建一个 Node + Express 静态服务器

    前端打包后的项目,有的需要部署在服务器上才能运行,有些实例的API也是需要部署在服务器上。这是可能会想到 PHP ...

  • 开发中的一些小事

    跨域 问题描述:php程序部署到nginx服务器,前端调用API报出跨域问题(200时没问题,422时出现此问题)...

  • Nginx

    Nginx的作用有哪些 部署前端静态代码,实现前后端分离 高并发下负载均衡,服务的容灾 代理服务器(WEB API...

  • Vue-cli4 配置代理,解决开发跨域

    什么情况下需要使用代理?如果您的前端应用和后端 API 服务器没有运行在同一个主机上,你需要在开发环境下将 API...

  • Cannot modify header information

    angular+php+nginx,前端需要跨域请求api,所以在接口的BaseController.php加上这...

  • 3.linux下Nginx安装 2018-01-13

    nginx :轻量级web服务器 也是一个反向代理服务器。可用于:支持php程序 反向代理 负载均衡服务器 邮件代...

  • kong-网络与防火墙

    端口 kong 通过多个链接实现不同的目录: 代理 管理api 集群 代理 kong通过nginx做前端代理处理流...

  • webpack代理

    webpack设置代理,用于解决跨域问题一个访问https api前端地址https://api.xtits.cn...

网友评论

      本文标题:php服务器中继代理前端api

      本文链接:https://www.haomeiwen.com/subject/tvhgidtx.html