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

替代Node.js发送ISO-8859-6编码请求的PHP/CURL方案咨询

解决方案:用PHP/CURL作为代理中转编码请求

完全可以通过PHP/CURL搭建一个简单的代理服务,帮你完成ISO-8859-6的编码转换,同时转发Cookie和请求数据。下面是分步实现方案:

第一步:编写PHP代理脚本

这个脚本会接收Node.js发来的请求,把请求数据转成ISO-8859-6编码,然后转发给目标服务器,最后把目标服务器的响应原封不动返回给Node.js(包括Cookie)。

<?php
// 替换成你的目标服务器接口地址
$targetUrl = 'https://your-target-server.com/target-endpoint';

// 获取Node.js传来的请求方法
$requestMethod = $_SERVER['REQUEST_METHOD'];

// 初始化CURL会话
$ch = curl_init($targetUrl);

// 基础CURL配置:返回响应内容、跟随重定向
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

// 转发Node.js传来的Cookie到目标服务器
if (isset($_SERVER['HTTP_COOKIE'])) {
    curl_setopt($ch, CURLOPT_COOKIE, $_SERVER['HTTP_COOKIE']);
}

// 处理POST请求的编码转换
if ($requestMethod === 'POST') {
    // 读取原始POST数据(Node.js发来的UTF-8格式)
    $postData = file_get_contents('php://input');
    // 转换为ISO-8859-6编码,TRANSLIT参数处理无法直接转换的字符
    $encodedData = iconv('UTF-8', 'ISO-8859-6//TRANSLIT', $postData);
    
    // 设置POST请求参数和编码头
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $encodedData);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        // 根据目标服务器要求调整Content-Type,比如表单或纯文本
        'Content-Type: application/x-www-form-urlencoded; charset=ISO-8859-6',
    ]);
}

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

// 转发目标服务器返回的Set-Cookie给Node.js,维持Cookie状态
$cookieList = curl_getinfo($ch, CURLINFO_COOKIELIST);
if (!empty($cookieList)) {
    foreach ($cookieList as $cookie) {
        $parts = explode("\t", $cookie);
        if (count($parts) >= 7) {
            $setCookieStr = "{$parts[5]}={$parts[6]}";
            $parts[4] && $setCookieStr .= "; Max-Age={$parts[4]}";
            $parts[0] && $setCookieStr .= "; Domain={$parts[0]}";
            $parts[1] && $setCookieStr .= "; Path={$parts[1]}";
            $parts[2] === "TRUE" && $setCookieStr .= "; Secure";
            $parts[3] === "TRUE" && $setCookieStr .= "; HttpOnly";
            header("Set-Cookie: $setCookieStr");
        }
    }
}

// 设置响应状态码并输出内容
http_response_code($httpCode);
echo $response;

curl_close($ch);
?>

关键细节说明:

  • 编码转换用iconv函数,确保从Node.js默认的UTF-8转成ISO-8859-6,//TRANSLIT避免因字符无法转换导致的报错。
  • Cookie全链路转发:把Node.js的请求Cookie传给目标服务器,同时把目标服务器的Set-Cookie返回给Node.js,保证你的Cookie状态可以持续更新。
  • Content-Type需匹配目标服务器的接收要求,比如表单用application/x-www-form-urlencoded,纯文本用text/plain。

第二步:调整Node.js的请求逻辑

现在你不需要直接请求目标服务器,而是把请求发送到PHP代理脚本,同时带上之前维护的Cookie:

const request = require('request');

// 替换成你的PHP代理脚本地址
const proxyUrl = 'http://your-php-server.com/proxy.php';
// 你要发送的原始数据(UTF-8格式)
const requestData = '包含阿拉伯语等需要ISO-8859-6编码的内容';
// 之前维护的Cookie字符串
const currentCookies = 'sessionId=xxx; token=yyy';

request.post({
    url: proxyUrl,
    body: requestData,
    headers: {
        'Cookie': currentCookies,
        'Content-Type': 'text/plain; charset=utf-8' // 告诉PHP代理数据编码
    },
    encoding: null // 避免Node.js自动解码响应,防止乱码
}, (err, res, body) => {
    if (err) {
        console.error('代理请求失败:', err);
        return;
    }

    // 更新Cookie:从响应头获取Set-Cookie,后续请求继续使用
    const newCookies = res.headers['set-cookie'];
    if (newCookies) {
        console.log('更新后的Cookie:', newCookies);
        // 这里可以把newCookies合并到你的Cookie池里
    }

    // 处理目标服务器的响应内容,根据实际编码转换
    console.log('响应内容:', body.toString('utf-8'));
});

关键细节说明:

  • 设置encoding: null让Node.js返回Buffer类型响应,避免自动解码导致乱码,后续可根据目标服务器响应编码转换为字符串。
  • 把之前维护的Cookie通过Cookie头传给PHP代理,保证请求身份一致。
  • 从响应头的set-cookie字段更新你的Cookie池,和之前直接请求目标服务器的逻辑完全兼容。

这样整个流程就可以正常运行:Node.js发送UTF-8数据到PHP代理,代理转码后转发给目标服务器,再把目标服务器的响应(含Cookie)返回给Node.js,完美解决Node.js不支持ISO-8859-6的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:20:53