[英]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_PROTOCOL
為https
。
如果代理服務器(例如負載平衡器)在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.