風雲論壇后台开发 → 浏览:帖子主题
* 帖子主题:nodejs 实现简单的 反向代理
風雲 (ID: 3)
头衔:论坛版主
等级:光明使者
积分:449
发帖:29
来自:保密
注册:2022/3/30 15:28:53
造访:2022/12/6 10:24:37
[ 第 1 楼 ] 回复
function proxy(req, res, target) {
    if(target?.hostname) req.headers.host = target.hostname;    // 重写 Host 头
    req.headers['x-real-ip'] = req.connection.remoteAddress.replace(/^::ffff:/, "");
    var forward = req.headers["x-forwarded-for"] || "";
    if(forward) forward += ", ";
    req.headers["x-forwarded-for"] = forward + req.headers['x-real-ip'];
    var options = {
        hostname: target?.host || "127.34.56.78",
        port: target?.port || 80,
        path: req.url,
        method: req.method,
        headers: req.headers
    };
    var proxy = (target?.protocol == "https" ? https: http).request(options);
    req.on("data", chunk => proxy.write(chunk));
    req.on("end", () => proxy.end() );
    proxy.on("response", pxy => {
        res.writeHead(pxy.statusCode, pxy.headers);
        pxy.on("data", chunk => res.write(chunk));
        pxy.on("end", () => res.end());
    });
    proxy.on("error", err => {
        res.writeHead(502, { "Content-Type": "text/plain" });
        res.end(err.message);
    });
}
2022/6/12 11:12:11 IP:已设置保密
風雲 (ID: 3)
头衔:论坛版主
等级:光明使者
积分:449
发帖:29
来自:保密
注册:2022/3/30 15:28:53
造访:2022/12/6 10:24:37
[ 第 2 楼 ] 回复
target 格式为:
{ host: ip or domain, hostname, port, protocol }

host可以为 ip 或者 域名
hostname如果存在,则重写请求中的 host,使用指定域名。否则默认使用客户请求中提供的 host 值。
port 默认值为 80。
protocol 默认为 "http"
2022/6/12 13:55:10 IP:已设置保密
風雲 (ID: 3)
头衔:论坛版主
等级:光明使者
积分:449
发帖:29
来自:保密
注册:2022/3/30 15:28:53
造访:2022/12/6 10:24:37
[ 第 3 楼 ] 回复
现在有点理解 http 模块的请求为什么这么不好做 ajax 了,http.request 大抵是为了做反向代理用的。
2022/6/12 18:05:33 IP:已设置保密
pojin (ID: 2)
等级:精灵
积分:117
发帖:1
来自:保密
注册:2022/3/30 11:42:27
造访:2022/12/5 23:24:22
[ 第 4 楼 ] 回复
赞!~~
2022/6/15 7:43:17 IP:已设置保密
風雲 (ID: 3)
头衔:论坛版主
等级:光明使者
积分:449
发帖:29
来自:保密
注册:2022/3/30 15:28:53
造访:2022/12/6 10:24:37
[ 第 5 楼 ] 回复
真早啊~!
2022/6/15 7:46:02 IP:已设置保密
分页: 1, 共 1 页
快速回复主题
账号/密码
用户: 没有注册? 密码:
评论内容