【问题标题】:Node.js http-proxy allow HTTPSNode.js http-proxy 允许 HTTPS
【发布时间】:2017-10-11 11:08:17
【问题描述】:

我有一个创建代理服务器并在访问页面时返回 url 请求的应用程序,但它仅适用于 http 网页,当我尝试访问 https 地址时,我会在浏览器。

为了解决这个问题,我从herelocalhost:8080 生成了一个自签名证书,但仍然无法访问受保护的网页...

这是我的代码:

var httpProxy = require('http-proxy');
var fs = require('fs');

var proxy = httpProxy.createServer({
  ssl: {
    key:  fs.readFileSync('ssl_key_8080.pem', 'utf8'),
    cert:  fs.readFileSync('ssl_cert_8080.pem', 'utf8')
  },
  target:'https://localhost:8080',
  secure: true
});

proxy.listen(443);

var http = require('http');

http.createServer(function (req, res) {
  var options = {
    target: 'http://' + req.headers.host,
  };
  req.host = req.headers.host;
  proxy.web(req, res, options, function(err){
    console.log('err', err)
  });
}).listen(8080);

proxy.on('proxyReq', function (proxyReq, req, res) {
  console.log('request url', JSON.stringify(req.url, true, 2));
});

有什么我做的不对吗?我按照http-proxy docs的指示进行操作

【问题讨论】:

    标签: node.js http-proxy


    【解决方案1】:

    问题是您有一个自签名证书,并且您正在使用文档中的代理设置对象中的安全标志

    您可以激活安全 SSL 证书的验证到 目标连接(避免使用自签名证书),只需设置 secure: true in 选项。

        var proxy = httpProxy.createServer({
      ssl: {
        key:  fs.readFileSync('ssl_key_8080.pem', 'utf8'),
        cert:  fs.readFileSync('ssl_cert_8080.pem', 'utf8')
      },
      target:'https://localhost:8080',
      secure: true
    });
    

    如果您删除安全标志,您可能会在浏览器中收到一条错误消息,指出该路线不安全。

    在您的代码上下文中。

    var httpProxy = require('http-proxy');
    var fs = require('fs');
    
    var proxy = httpProxy.createServer({
      ssl: {
        key:  fs.readFileSync('ssl_key_8080.pem', 'utf8'),
        cert:  fs.readFileSync('ssl_cert_8080.pem', 'utf8')
      },
      target:'https://localhost:8080'
    });
    
    proxy.listen(443);
    
    var http = require('http');
    
    http.createServer(function (req, res) {
      var options = {
        target: 'http://' + req.headers.host,
      };
      req.host = req.headers.host;
      proxy.web(req, res, options, function(err){
        console.log('err', err)
      });
    }).listen(8080);
    
    proxy.on('proxyReq', function (proxyReq, req, res) {
      console.log('request url', JSON.stringify(req.url, true, 2));
    });
    

    【讨论】:

    • 还是不行,现在我在浏览器中得到The connection was reset
    • 您是否以 root 身份运行节点?这就解释了为什么需要监听端口 443 stackoverflow.com/questions/26579028/…
    • 您可以以 root 身份运行,也可以更改第 13 行以侦听不同的端口
    • 是的,我使用 sudo node 以 root 身份运行 node
    • 你有没有从节点进程中得到日志。如果你想在那里玩,我已经把它放在 Glitch 上? glitch.com/edit/#!/join/8e40de60-f8e9-4400-837d-8d87d4151cbd
    猜你喜欢
    • 2015-02-06
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 2015-06-25
    • 2018-02-14
    • 1970-01-01
    相关资源
    最近更新 更多