2017-10-09 118 views
0

我使用Express在NodeJS上通过HTTPS提供服务器。NodeJS/Express自动检测SSL over HTTP(HTTPS)的解释?

上传文件时,我使用控制器中的req.protocol指令来获取URL的HTTP或HTTPS“部分”,以便我可以使用绝对URL保存该文件。问题是,如果不启用express的“信任代理”设置(http://expressjs.com/en/api.html#trust.proxy.options.table),则HTTPS不会被检测到。

我认为这个设置用于实际的重定向(当使用HTTP URL和服务器进行301重定向到HTTPS时)。

所以这更多的是一个解释的问题,而不是解决方案之一:

为什么不HTTPS获得通过调用该网址时,系统检测到?

回答

1

trust proxy与301重定向无关。

那设置运行的节点服务器当代理服务器后面是很重要的:

+----------HTTPS--------+---HTTP---+ 
    |      |   | 
client --> internet --> proxy --> node.js 

典型的是你有某种互联网和您的节点服务器之间代理的;例如CDN服务器,负载均衡器或简单地nginx实例等。 HTTPS连接在客户端和该代理之间建立。该代理关心SSL证书的必要争夺和加密连接,并且不会给应用程序服务器(节点)带来这些细节的负担。然后它仅通过普通的HTTP将请求的相关细节转发到您的节点服务器。您的服务器仅将代理视为请求的来源,而不是客户端。

由于节点服务器本身没有处理HTTPS连接,它怎么知道客户端和代理之间的连接是否是HTTPS?它不能。代理服务器也需要自动转发该信息。它在X-Forwarded-* HTTP标头中这样做。它的信息特别是HTTP或HTTPS是在X-Forwarded-Proto标题中发送的。

问题是,这些只是HTTP头。任何人都可以设置这些标题客户端本身可以设置这些标题。这就是为什么你需要明确选择使用trust proxy设置,iif和这些标头,你知道你的应用程序将运行在设置这些标头的代理之后。如果您没有运行代理服务器,但您的节点服务器直接暴露于互联网,则必须关闭该设置;否则任何人都可以设置这些标题,你的服务器将服从这些标题并导致使用虚假信息。

+0

是的,这是非常彻底的,事实上Node看起来有点可疑,而没有“设置”任何东西。我现在明白了。 谢谢 – Ncifra