Apache-2.2
當原始請求通過 https 發出時,Location-header 中的 http
我目前正在
https
我們的生產環境中實施,但我在這里為一些小事摸不著頭腦。SSL 在負載均衡器中終止,我們堆棧中的流程基本上是這樣的:
生產:瀏覽器 <-
https
-> 負載均衡器 <-http
-> Apache <-http
-> 負載均衡器 <-http
-> Tomcat測試:瀏覽器 <-
https
-> nginx <-http
-> 負載均衡器 <-http
-> Tomcat當我通過 HTTPS 訪問我們的登錄頁面時:
請求標頭
POST /login/form HTTP/1.1 Host: www.example.org Connection: keep-alive Content-Length: 74 Cache-Control: max-age=0 Origin: https://www.example.org Content-Type: application/x-www-form-urlencoded Referer: https://www.example.org/login Accept-Encoding: gzip,deflate,sdch Accept-Language: nb,en-US;q=0.8,en;q=0.6
響應標頭
HTTP/1.1 302 Moved Temporarily Server: nginx Date: Fri, 17 Jan 2014 11:16:50 GMT Content-Length: 0 Connection: keep-alive Set-Cookie: FOO=example Location: http://www.example.org/portal Strict-Transport-Security: max-age=31536000
我與一位開發人員交談,他告訴我以下內容:
在程式碼中有諸如 request.sendRedirect("/portal") 之類的東西,其餘的由 Tomcat 完成。
我能夠在測試環境中重現該問題,儘管堆棧有所不同。
我的問題:
- 當來自瀏覽器的原始請求是用 發出時,為什麼我會
http
在 -header 中得到方案?Location``https
- 這是 Apache mod_rewrite/mod_proxy 還是 nginx 問題?
- 這是Tomcat的問題嗎?
您在響應標頭中獲得 http,因為到達 Apache 的請求是 HTTP - SSL 已在負載平衡器處被剝離。所以從 Apache 所見,它只是一個 HTTP 請求。
您可以通過設置解決此問題
ServerName https://www.example.org
在全域或虛擬主機配置中。這將覆蓋預設的 http 方案,因此 Apache 將發送您想要的響應。ServerName的文件提到了這一點。
我有一個類似的問題。在您的虛擬主機配置中添加以下內容應該可以解決問題。基本上它會將http請求編輯為https
Header edit Location ^http://(.*)$ https://$1