風雲論壇后台开发 → 浏览:帖子主题
* 帖子主题:nodejs 实现简单的 反向代理
風雲 (ID: 3)
头衔:论坛版主
等级:天使
积分:1357
发帖:59
来自:保密
注册:2022/3/30 15:28:53
造访:2024/4/23 15:57:25
[ 第 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)
头衔:论坛版主
等级:天使
积分:1357
发帖:59
来自:保密
注册:2022/3/30 15:28:53
造访:2024/4/23 15:57:25
[ 第 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)
头衔:论坛版主
等级:天使
积分:1357
发帖:59
来自:保密
注册:2022/3/30 15:28:53
造访:2024/4/23 15:57:25
[ 第 3 楼 ] 回复
现在有点理解 http 模块的请求为什么这么不好做 ajax 了,http.request 大抵是为了做反向代理用的。
2022/6/12 18:05:33 IP:已设置保密
pojin (ID: 2)
等级:精灵王
积分:244
发帖:1
来自:保密
注册:2022/3/30 11:42:27
造访:2024/4/19 8:46:13
[ 第 4 楼 ] 回复
赞!~~
2022/6/15 7:43:17 IP:已设置保密
風雲 (ID: 3)
头衔:论坛版主
等级:天使
积分:1357
发帖:59
来自:保密
注册:2022/3/30 15:28:53
造访:2024/4/23 15:57:25
[ 第 5 楼 ] 回复
真早啊~!
2022/6/15 7:46:02 IP:已设置保密
serverMM3 (ID: 42)
等级:精灵
积分:132
发帖:6
来自:保密
注册:2023/8/19 13:09:21
造访:2023/8/26 9:43:51
[ 第 6 楼 ] 回复
这种反向代理的应用场景是哪里?
2023/8/19 13:25:30 IP:已设置保密
風雲 (ID: 3)
头衔:论坛版主
等级:天使
积分:1357
发帖:59
来自:保密
注册:2022/3/30 15:28:53
造访:2024/4/23 15:57:25
[ 第 7 楼 ] 回复
例如:你的服务器跑了 nodejs,使用了 80 端口,后来因业务需要,想在服务器上跑一个 php 程序,但是 80 端口被 nodejs 占用了,php 站点也想使用 80 端口或 443 端口怎么办?这时候可以将 php 站点使用其他端口,然后用户可以通过特定域名访问 nodejs 的 80 端口得到另一个端口的 php 站点 内容,这就是端口反向代理技术。端口反向代理对用户是无感的,正向代理需要在用户浏览器端配置代理。
2023/8/19 21:45:39 IP:已设置保密
serverMM3 (ID: 42)
等级:精灵
积分:132
发帖:6
来自:保密
注册:2023/8/19 13:09:21
造访:2023/8/26 9:43:51
[ 第 8 楼 ] 回复
效率高吗?
2023/8/20 11:11:37 IP:已设置保密
分页: 1, 共 1 页
快速回复主题
账号/密码
用户: 没有注册? 密码:
评论内容