簡體   English   中英

端口443上的Elastic Load Balancer適用於強制SSL Ruby On Rails應用程序,但是為什么呢?

[英]Elastic Load Balancer on port 443 works for forced SSL Ruby On Rails application, but why?

我的ruby on Rails應用程序配置了以下內容:

config.force_ssl = true

我設置了以下彈性負載均衡器:

在此處輸入圖片說明

使用此配置,一切正常,但我不明白為什么? 使用上面的代碼,我的應用程序實例將返回301重定向以響應HTTP請求。 負載平衡器處理HTTP請求后,會將其作為HTTP請求轉發到實例。 這不應該導致另一個301,從而導致無限循環嗎?

編輯我對自己的答案有所考慮,因此決定對其進行更詳細的介紹。

網絡通信通常由幾層組成,其中包括物理層 (即信息經過的電纜/無線電信道), 傳輸層 (通常為TCP / IP), 協議層 (在我們的情況下通常為HTTP或HTTPS)最后是我們的Rails應用程序處理的應用程序層

Rails通常永遠不會與實際的HTTPS數據流聯系,因為這是由Web服務器處理的。 那么,force_ssl到底如何工作?

協議層由Web服務器(nginx,mongrel ...)處理,這是誰首先要關心強制ssl。 當網絡服務器將請求移交給應用程序層(因此是Rails應用程序)時,它還會提供大量元數據,其中包括請求者IP,請求路徑,請求格式,許多標頭變量以及有關已使用信息的信息。協議。

當請求通過端口443到達您的Web服務器(並使用HTTPS協議)時,Web服務器SERVER_PROTOCOL標頭標志SERVER_PROTOCOLhttps

如果代理服務器(例如負載平衡器)在443上收到請求並將其轉發到80,它將向請求添加X-FORWARDED-PROTO=https標頭,網絡服務器可將其用於您的rails應用程序。

現在,長話短說: config.force_ssl需要SERVER_PROTOCOL X-FORWARDED-PROTO config.force_ssl X-FORWARDED-PROTO來表示https

原始答案 rails force_ssl方法並沒有真正強制請求到達服務器上的端口443,當原始(客戶端)請求通過ssl通過ssl發送時,它就可以滿足。 負載平衡器(作為代理)將標頭X-FORWARDED-PROTO設置為“ https”。 rails信任該信息,這就是為什么它起作用的原因。

有關更多信息,請參見彈性負載平衡器文檔: http : //docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/TerminologyandKeyConcepts.html#x-forwarded-for

暫無
暫無

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

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