乐趣区

关于前端:使用-httpproxy-对网络请求进行代理

应用上面这段简略的代码对网络申请进行代理:

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

const targetUrl = 'https://www.sap.cn/index.html';

const proxy = httpProxy.createProxyServer({target: targetUrl,});

http.createServer(function (req, res) {proxy.web(req, res);

}).listen(8089);

console.log('Proxy listens in 8089');

这段代码的语义是,创立一个代理 HTTP 服务器,监听在端口 8089 上。因而该代理服务器接管到任何发送到 8089 端口的 HTTP 申请,都会主动将其发送到 targetUrl 指定的 sap 网站上。

咱们命令行启动这个服务器:

node server.js

遇到如下谬误音讯:

Error [ERR_TLS_CERT_ALTNAME_INVALID]: Hostname/IP does not match certificate’s altnames: Host: localhost. is not in the cert’s altnames: DNS:www.sap.cn

具体的调用栈:

at Object.checkServerIdentity (tls.js:297:12)
    at TLSSocket.onConnectSecure (_tls_wrap.js:1507:27)
    at TLSSocket.emit (events.js:315:20)
    at TLSSocket._finishInit (_tls_wrap.js:932:8)
    at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:706:12) {
  reason: "Host: localhost. is not in the cert's altnames: DNS:www.sap.cn",
  host: 'localhost',
  cert: {subject: [Object: null prototype] {
      C: 'DE',
      L: 'Walldorf',
      O: 'SAP SE',
      CN: 'www.sap.cn'
    },

当咱们应用 SSL 连贯到服务器时,服务器所做的第一件事就是提供一个证书,下面写着 我是 api.dropbox.com。证书有一个 主题 ,该主题有一个 CN(Common Name, 通用名称的缩写)。证书也能够有一个或多个 subjectAltNames。当 node.js 连贯到服务器时,node.js 会获取此证书,而后验证它认为它正在连接的域名 (api.dropbox.com) 是否与主题的 CN 或其中一个代替名称匹配。请留神,在 node 0.10.x 中,如果应用 IP 连贯,则 IP 地址必须在 altnames 中 – node.js 不会尝试依据 CN 验证 IP。

尽管谬误是对于 SSL 证书和域名不匹配,然而在 http-proxy 模块中,当您的服务器是 HTTP 并且指标是 HTTPS 时,通常会呈现这种谬误。

到这个开发包的官网 查找起因。

应用下列代码捕获谬误:

proxy.on('error', function(e) {...});

当一个申请被代理时,它遵循两个不同的管道,它们将转换利用于 req 和 res 对象。第一个管道(传入)负责创立和操作将客户端连贯到 target 的流。第二个管道(传出)负责创立和操作从 target 向客户端返回数据的流。

在创立时增加 secure:false 选项,问题隐没:

退出移动版