求助:开发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
相关产品推荐
相关产品推荐

