代码之家  ›  专栏  ›  技术社区  ›  Ncifra

NodeJS/Express自动检测HTTP上的SSL(HTTPS)解释?

  •  0
  • Ncifra  · 技术社区  · 7 年前

    我在带有Express的NodeJS上有一个HTTPS服务器。

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

    我认为这个设置是在实际重定向的情况下使用的(当使用HTTP URL和服务器执行301重定向到HTTPS时)。

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   deceze    7 年前

    trust proxy 与301重定向无关。

    运行节点服务器时,该设置很重要

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

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

    既然节点服务器本身不处理HTTPS连接,它怎么知道客户端和代理之间的连接是否是HTTPS?它不能。代理也需要自愿转发这些信息。它在 X-Forwarded-* HTTP标头。具体是HTTP还是HTTPS的信息在 X-Forwarded-Proto 标题。

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