2018-05-30

TOMCAT與前端PROXY代理問題



場景:
TOMCAT開HTTP 80,前端以NGINX開HTTPS 443做代理

問題:
servlet的response.sendRidirect("...")會將相對路徑轉為絕對路徑,但轉換後scheme(http)不對

解法一:
修改server.xml的Connector,加入屬性 scheme="https",但參考tomcat的Response.java原始碼,發現如果Connector跟scheme設定的port不同時,會在sendRedirect的網址加入Connector埠號,因此必須同時設定redirectPort="443"

解法二:
修改context.xml,加入屬性 useRelativeRedirects="true",強迫sendRedirect的產生的網址為相對路徑(但可能某些舊的瀏覽器會產生問題)。

REF:
https://github.com/apache/tomcat/blob/c126b1f373751380f0070c2f890cd3554af363fd/java/org/apache/catalina/connector/Response.java
https://tomcat.apache.org/tomcat-8.5-doc/config/context.html
https://tomcat.apache.org/tomcat-8.5-doc/config/http.html

附resin解法( <resin:SetRequestSecure>):