[英]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.