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

求助:开发NodeJS HTTP/HTTPS拦截代理服务器(直接访问站点报错)

NodeJS 透明代理服务器实现(支持直接访问目标站点并修改响应)

原代码问题分析

你的代码仅创建了一个返回固定内容的HTTP服务器,完全未实现代理核心逻辑:

  • 未解析客户端请求的目标主机(比如访问google.com时,代理需要明确转发目标)
  • 未处理HTTPS请求必需的CONNECT方法(这是HTTPS代理建立隧道的关键步骤)
  • 未将请求转发至目标服务器,更没有处理响应修改的逻辑

可用基础代码参考

以下是支持HTTP/HTTPS代理、可直接访问目标站点且能修改响应的基础实现:

const http = require('http');
const httpProxy = require('http-proxy');
const url = require('url');
const net = require('net');

// 创建代理实例
const proxy = httpProxy.createProxyServer({});

// 创建代理服务器
const server = http.createServer((req, res) => {
  // 解析请求的目标URL
  const targetUrl = url.parse(req.url);
  const target = `${targetUrl.protocol || 'http://'}${targetUrl.host}`;

  // 拦截并修改响应
  proxy.once('proxyRes', (proxyRes, req, res) => {
    let body = '';
    // 收集原始响应数据
    proxyRes.on('data', (chunk) => {
      body += chunk.toString();
    });
    // 数据收集完成后修改并返回
    proxyRes.on('end', () => {
      // 示例:替换响应文本内容
      const modifiedBody = body.replace('Google', 'Proxy Modified Google');
      // 更新响应长度
      res.setHeader('Content-Length', Buffer.byteLength(modifiedBody));
      // 发送修改后的响应
      res.end(modifiedBody);
    });
  });

  // 转发请求到目标服务器
  proxy.web(req, res, { target }, (err) => {
    res.writeHead(500, { 'Content-Type': 'text/plain' });
    res.end(`Proxy Error: ${err.message}`);
  });
});

// 处理HTTPS的CONNECT请求,建立TCP隧道
server.on('connect', (req, clientSocket, head) => {
  const [host, port] = req.url.split(':');
  const targetPort = port || 443;

  // 连接目标服务器
  const serverSocket = net.connect(targetPort, host, () => {
    // 告知客户端隧道已建立
    clientSocket.write('HTTP/1.1 200 Connection Established\r\n\r\n');
    // 双向转发客户端与目标服务器的数据
    serverSocket.write(head);
    serverSocket.pipe(clientSocket);
    clientSocket.pipe(serverSocket);
  });

  // 处理连接错误
  serverSocket.on('error', (err) => {
    clientSocket.end(`HTTP/1.1 500 Proxy Error\r\n\r\n${err.message}`);
  });
  clientSocket.on('error', () => {
    serverSocket.end();
  });
});

// 启动代理服务器
server.listen(8080, () => {
  console.log('Transparent proxy server running on port 8080');
});

关键说明

  • HTTP请求处理:通过解析req.url获取目标主机,使用proxy.web转发请求,通过proxyRes事件拦截并修改响应内容。
  • HTTPS请求处理:监听connect事件,建立客户端与目标服务器的TCP隧道,实现HTTPS代理转发。
  • 响应修改:在proxyRes事件中收集原始响应数据,修改后重新发送给客户端。

Windows代理设置注意事项

  • 打开「Internet选项」→「连接」→「局域网设置」
  • 勾选「为LAN使用代理服务器」,地址填localhost,端口填8080
  • 可选:勾选「对于本地地址不使用代理服务器」,避免本地请求被代理
  • HTTPS响应修改补充:如果需要修改HTTPS响应内容,需使用中间人代理模式,需生成并信任自签名证书,可扩展代码集成https模块实现,或借助node-mitmproxy等工具简化开发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 00:23:12