9

我有一個ELB(Amazon Elastic Load Balancer)被配置爲在HTTPS上負載平衡最終用戶請求,在後端我有我的應用程序在配置好的Tomcat服務器上運行在HTTP上。HTTPS到Elastic Load Balancer到HTTP Tomcat服務器的重定向問題

因此,當我的最終用戶嚮應用程序發出請求時,請求將使用HTTPS,因爲他們訪問ELB,現在,ELB會在HTTP內部將它重定向到tomcat服務器。在tomcat中,我的應用程序通過Spring Security受到保護,如果請求是針對受保護的資源,並且用戶未登錄,則用戶將重定向到配置的登錄頁面。現在,對最終用戶的重定向將通過HTTP進行,因爲tomcat服務器已經將來自ELB的請求作爲HTTP獲取。這現在將導致404,因爲我沒有配置HTTP上的內部流量。

我們如何解決這個問題?唯一的選擇是在enduser-ELB和ELB-tomcat上都使用HTTPS,還是我在這裏丟失了一些東西?

回答

9

ELB設置了一個X-Forwarded-Proto標頭,該標頭允許您指出客戶端用於連接到負載均衡器的協議。請參閱documentation

您可以配置彈簧安全性來查看此標題,例如,參見this answer

+1

非常感謝你..它解決了我的問題.. – 2012-03-30 06:01:44

0

我在網上找到了這個難題,最後我找到了一個辦法。

問題是,只要http在內部重定向到ELB上的https端口,它就會被重定向回端口80,從而創建一個循環。發生這種情況是因爲ELB卸載SSL,然後再次連接到端口80。

最後經過一番研究,我得到了正確的重寫規則來管理X-Forwarded-Proto,即使ELB卸載SSL tomcat,現在原始請求使用SSL。

這是在Tomcat 8上使用Tomcat Valves完成的。確保它也可以在早期版本上完成。我已經使用閥門在Tomcat上啓用了重寫規則。之後,它就像在Apache上編寫重定向規則一樣簡單。

步驟如下:

步驟1:

一個。 b。在tomcat conf文件夾下打開context.xml。粘貼以下行略低於

<Valve className="org.apache.catalina.valves.rewrite.RewriteValve" /> 

注:這將在全球啓用閥。在這種情況下,對於需要特定主機啓用,那麼它應該在裏面server.xml中的粘貼該特定域

第2步:

一個。打開conf/server.xml b。粘貼略高於</Host>

<Valve className="org.apache.catalina.valves.rewrite.RewriteValve" /> 

步驟3以下行:

一個。打開web.xml所在的文件夾。例如,如果應用程序託管在ROOT和Web下。xml將在webapps下/ ROOT/WEB-INF

b。同樣,如果應用程序託管在webapps/myappfolder下,那麼web.xml將位於webapps/myappfolder/WEB-INF

c。在WEB-INF文件夾中創建一個新文件rewrite.config。並粘貼以下重寫規則:

RewriteCond %{HTTP:X-Forwarded-Proto} !https 
RewriteCond %{HTTPS} off 
RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]