Apache-2.2

當原始請求通過 https 發出時,Location-header 中的 http

  • August 2, 2017

我目前正在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 完成。

我能夠在測試環境中重現該問題,儘管堆棧有所不同。

我的問題:

  1. 當來自瀏覽器的原始請求是用 發出時,為什麼我會http在 -header 中得到方案?Location``https
  2. 這是 Apache mod_rewrite/mod_proxy 還是 nginx 問題?
  3. 這是Tomcat的問題嗎?

您在響應標頭中獲得 http,因為到達 Apache 的請求是 HTTP - SSL 已在負載平衡器處被剝離。所以從 Apache 所見,它只是一個 HTTP 請求。

您可以通過設置解決此問題

ServerName https://www.example.org

在全域或虛擬主機配置中。這將覆蓋預設的 http 方案,因此 Apache 將發送您想要的響應。ServerName的文件提到了這一點。

我有一個類似的問題。在您的虛擬主機配置中添加以下內容應該可以解決問題。基本上它會將http請求編輯為https

Header edit Location ^http://(.*)$ https://$1

引用自:https://serverfault.com/questions/567966