2017-10-09 55 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