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

NodeJS/Express automatic detection of SSL over HTTP (HTTPS) explanation?

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

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

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

所以这更像是一个解释性问题,而不是一个解决方案:

为什么通过它调用 URL 时检测不到 HTTPS?

trust proxy 与 301 重定向无关。

当 运行 您的节点服务器 在代理 后面时,该设置很重要:

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

通常情况下,您在 Internet 和您的节点服务器之间有某种代理;例如 CDN 服务器、负载均衡器或简单的 nginx 实例等。 HTTPS 连接在客户端和该代理之间建立。代理关心 SSL 证书的必要争论和加密连接,并且不会为您的应用程序服务器(节点)增加这些细节的负担。然后它仅通过纯 HTTP 将请求的相关详细信息转发到您的节点服务器。您的服务器仅将代理视为请求的来源,而不是客户端。

由于节点服务器本身不处理HTTPS连接,它怎么知道客户端和代理之间的连接是不是HTTPS呢?它不能。代理也需要自愿转发该信息。它在 X-Forwarded-* HTTP header 中这样做。具体是 HTTP 还是 HTTPS 的信息在 X-Forwarded-Proto header.

中发送

事实是,那些只是 HTTP headers。任何人都可以设置那些 header。客户端本身可以设置那些 headers。这就是为什么你需要明确地选择使用那些 headers 与 trust proxy 设置,iif 并且当 你知道你的应用程序将 运行 落后设置那些 header 的代理。当您不 运行 在代理后面但您的节点服务器直接暴露在互联网上时,您必须关闭该设置;否则任何人都可以设置这些 headers,您的服务器将遵守这些 headers 并导致使用虚假信息。