簡體   English   中英

NodeJS / Express通過HTTP自動檢測SSL(HTTPS)的解釋?

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

我在帶有Express的NodeJS上通過HTTPS擁有服務器。

上載文件時,我已在控制器中使用req.protocol指令來獲取URL的HTTP或HTTPS“部分”,以便可以使用絕對URL保存文件。 問題在於,如果未啟用express( http://expressjs.com/en/api.html#trust.proxy.options.table )的“信任代理”設置,則不會檢測到HTTPS。

我認為此設置是在實際重定向的情況下使用的(使用HTTP URL並且服務器將301重定向到HTTPS時)。

因此,這更多是一個解釋性問題,而不是解決方案:

為什么通過URL調用URL時未檢測到HTTPS?

trust proxy與301重定向無關。

在代理后面運行節點服務器時,這些設置很重要:

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

通常,您在Internet和節點服務器之間具有某種代理。 例如CDN服務器,負載平衡器,或者僅僅是nginx實例等。 在客戶端和該代理之間建立HTTPS連接。 代理關心SSL證書的必要處理和對連接進行加密,並且不會給您的應用服務器(節點)增加這些細節。 然后,它將通過純HTTP僅將請求的相關詳細信息轉發到您的節點服務器。 您的服務器僅將代理視為請求的源,而不是客戶端。

由於節點服務器本身不處理HTTPS連接,因此如何知道客戶端和代理之間的連接是否為HTTPS? 不可以 代理也需要自願轉發該信息。 它在X-Forwarded-* HTTP標頭中執行此操作。 X-Forwarded-Proto標頭中發送的信息是專門用於HTTP還是HTTPS。

事實是,這些只是HTTP標頭。 任何人都可以設置這些標題。 客戶端本身可以設置這些標頭。 這就是為什么您需要在trust proxy設置中明確選擇使用這些標頭, 以及如果您知道您的應用將在設置這些標頭的代理后面運行時使用。 如果您沒有在代理后面運行,但是您的節點服務器直接暴露在Internet上,則必須將該設置關閉; 否則任何人都可以設置這些標頭,那么您的服務器將服從那些標頭,並導致使用虛假信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM