Apache-2.2
Apache 反向代理在重定向後跳回不安全協議
我安裝了一個反向代理 apache 伺服器來處理 tomcat 的 SSL 加密。我們有一個 struts Web 應用程序,每次使用
response.sendRedirect()
時,應用程序都會退回到正常的 HTTP 協議,而不是停留在 HTTPS。該應用程序必須使用這兩種協議執行,並且我無法通過 tomcat 容器處理 SSL。我可以使用 HTTPS 並通過連結和操作進行導航。但是,如果我遇到一個使用重定向的操作,它只會是 HTTP。為什麼呢?
SSLProxyEngine [off|on] # (Differs between the ssl and the other normal conf) ProxyPreserveHost On ProxyPass / http://mysite:1234/ ProxyPassReverse / http://mysite:1234/
這是我的配置。我考慮過在 ssl 配置中切換
http
到https
,但這會導致:錯誤的網關
代理伺服器收到來自上游伺服器的無效響應。此外,在嘗試使用 ErrorDocument 處理請求時遇到 502 Bad Gateway 錯誤。
如何讓重定向堅持 HTTPS?
如果 sendRedirect 使用相對路徑,Tomcat 將添加絕對元素,包括 scheme (http/https) 和 servername。
除非您覆蓋它,否則 Scheme 將預設為 http。伺服器名稱將來自您已經仔細傳遞的主機標頭。
我遇到了同樣的問題,並在一個單獨的埠上使用了一個新的 Tomcat 連接器(與現有的連接器一起),它覆蓋了該方案並設置了良好的埠:
<Connector port="8443" protocol="HTTP/1.1" URIEncoding="UTF-8" connectionTimeout="20000" scheme="https" proxyPort="443"/>
然後在 Apache 中,SSL 虛擬主機具有:
ProxyPass / http://<tomcat_server>:8443/
普通 HTTP 虛擬主機繼續使用現有的連接器埠 (8080)
或者,您可以在呼叫 sendRedirect() 時硬編碼重定向位置,但這顯然不靈活。