解决方案几乎不存在,并且文档最多只能提供支持both在一台服务器上。这里的技巧是了解客户端代理配置可能会向 http 代理服务器发送 https 请求。如果您指定 HTTP 代理,然后选中“所有协议都相同”,则对于 Firefox 来说也是如此。
您可以通过侦听“connect”事件来处理发送到 HTTP 服务器的 https 连接。请注意,您无法访问连接事件上的响应对象,只能访问套接字和正文头。作为代理服务器,通过此套接字发送的数据将保持加密状态。
在此解决方案中,您不必创建自己的证书,并且不会因此而出现证书冲突。流量只是被代理,不会被拦截并用不同的证书重写。
// Install npm dependencies first
// npm init
// npm install --save [email protected] /cdn-cgi/l/email-protection
// npm install --save [email protected] /cdn-cgi/l/email-protection
var httpProxy = require("http-proxy");
var http = require("http");
var url = require("url");
var net = require('net');
var server = http.createServer(function (req, res) {
var urlObj = url.parse(req.url);
var target = urlObj.protocol + "//" + urlObj.host;
console.log("Proxy HTTP request for:", target);
var proxy = httpProxy.createProxyServer({});
proxy.on("error", function (err, req, res) {
console.log("proxy error", err);
res.end();
});
proxy.web(req, res, {target: target});
}).listen(8080); //this is the port your clients will connect to
var regex_hostport = /^([^:]+)(:([0-9]+))?$/;
var getHostPortFromString = function (hostString, defaultPort) {
var host = hostString;
var port = defaultPort;
var result = regex_hostport.exec(hostString);
if (result != null) {
host = result[1];
if (result[2] != null) {
port = result[3];
}
}
return ( [host, port] );
};
server.addListener('connect', function (req, socket, bodyhead) {
var hostPort = getHostPortFromString(req.url, 443);
var hostDomain = hostPort[0];
var port = parseInt(hostPort[1]);
console.log("Proxying HTTPS request for:", hostDomain, port);
var proxySocket = new net.Socket();
proxySocket.connect(port, hostDomain, function () {
proxySocket.write(bodyhead);
socket.write("HTTP/" + req.httpVersion + " 200 Connection established\r\n\r\n");
}
);
proxySocket.on('data', function (chunk) {
socket.write(chunk);
});
proxySocket.on('end', function () {
socket.end();
});
proxySocket.on('error', function () {
socket.write("HTTP/" + req.httpVersion + " 500 Connection error\r\n\r\n");
socket.end();
});
socket.on('data', function (chunk) {
proxySocket.write(chunk);
});
socket.on('end', function () {
proxySocket.end();
});
socket.on('error', function () {
proxySocket.end();
});
});