Nginx SSL+tomcat集羣,request.getScheme() 取到https正確的協議

最近在作一個項目, 架構上使用了 Nginx +tomcat 集羣, 且nginx下配置了SSL,tomcat no SSL,項目使用https協議java



可是,明明是https url請求,發現 log裏面nginx

0428 15:55:55 INFO  (PaymentInterceptor.java:44) preHandle() - requestStringForLog:    {
        "request.getRequestURL():": "http://trade.feilong.com/payment/paymentChannel?id=212&s=a84485e0985afe97fffd7fd7741c93851d83a4f6",
        "request.getMethod:": "GET",
        "_parameterMap":         {
            "id": ["212"],
            "s": ["a84485e0985afe97fffd7fd7741c93851d83a4f6"]
        }
    }

request.getRequestURL() 輸出出來的 一直是  apache

http://trade.feilong.com/payment/paymentChannel?id=212&s=a84485e0985afe97fffd7fd7741c93851d83a4f6瀏覽器

 

可是瀏覽器中的URL倒是tomcat

https://trade.feilong.com/payment/paymentChannel?id=212&s=a84485e0985afe97fffd7fd7741c93851d83a4f6架構

 

 

瞬間要顛覆個人Java觀尷尬,API上寫得很清楚:測試

 

getRequestURL():url

Reconstructs the URL the client used to make the request. 

The returned URL contains a protocol, server name, port number, and server path, 
but it does not include query string parameters.

也就是說, getRequestURL() 輸出的是不帶query string的路經(含協議,端口,server path等信息).code



而且,還發現server

request.getScheme()  //老是 http,而不是實際的http或https
request.isSecure()  //老是false(由於老是http)
request.getRemoteAddr()  //老是 nginx 請求的 IP,而不是用戶的IP
request.getRequestURL()  //老是 nginx 請求的URL 而不是用戶實際請求的 URL
response.sendRedirect( 相對url )  //老是重定向到 http 上 (由於認爲當前是 http 請求)

查閱了一些資料,找到了解決方案:

 

解決方法很簡單,只須要分別配置一下 Nginx 和 Tomcat 就行了,而不用改程序。

 

配置 Nginx 的*.conf文件轉發選項:

  

proxy_set_header       Host $host;
proxy_set_header  X-Real-IP  $remote_addr;
proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto  $scheme;

proxy_set_header X-Forwarded-Proto $scheme; 加上這句

配置Tomcat server.xml 的 Engine 模塊下配置一個 Valve:

<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="X-Forwarded-For"
protocolHeader="X-Forwarded-Proto"
protocolHeaderHttpsValue="https"/>

配置雙方的 X-Forwarded-Proto 就是爲了正確地識別實際用戶發出的協議是 http 仍是 https。

 

這樣以上5項測試就都變爲正確的結果了,就像用戶在直接訪問 Tomcat 同樣。

相關文章
相關標籤/搜索