Nginx反向代理tomcat時response.sendRedirect問題


原文地址:

http://blog.sina.com.cn/s/blog_40ce02d70102wbzo.html

Nginx https反向代理到tomcat http
用戶登錄跳轉時 response.sendRedirect 總是轉到http的地址而不是https
 
實際測試影響到以下函數:
request.getScheme()  獲取不到實際的https  
request.isSecure() 總是false  
request.getRemoteAddr()   
request.getRequestURL()   
response.sendRedirect(url) 總是重定向到 http 上
 
解決辦法: 
1.修改nginx配置:
proxy_pass      http://127.0.0.1:8080;
    proxy_set_header Host    $host;//非80、443端口使用$host:$server_port
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_redirect off;
    proxy_set_header  X-Forwarded-Proto  $scheme;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
2.修改tomcat(conf/server.xml),在Engine節點添加
            remoteIpHeader="X-Forwarded-For"
            protocolHeader="X-Forwarded-Proto"
            protocolHeaderHttpsValue="https"/>
 
 

解決nginx https代理tomcat redirect問題

原文地址:

https://blog.csdn.net/juncke/article/details/52539175

問題描述
http服務器:nginx,10.10.10.95,版本:1.10.1,請求使用協議為https,端口為18080。

服務服務器:tomcat,10.10.10.92,使用協議為http,端口為8080。

問題:當在業務服務器使用sendRedirect時,tomcat響應302給nginx,nginx再響應給瀏覽器,默認情況下,nginx響應給瀏覽器的location會將schema換為http,端口為:80。

這就導致瀏覽器redirect后,訪問不到正確資源。


過程舉例:

瀏覽器輸入:https://10.10.10.95:18080/redirect_test.do
redirect_test.do中執行sendRedirect("/welcome.do")
瀏覽器接收到的redirect響應(302)中location為http://10.10.10.95/welcome.do
瀏覽器跳到http://10.10.10.95/welcome.do,發現訪問不了

解決方案
修改nginx配置,關鍵配置如下:

 

server{
  listen 18080;
  server_name ecsc;
  ssl on;
  ssl_certificate /root/ssl/test.crt;
  ssl_certificate_key /root/ssl/test_nopass.key;
  error_page 497 https://$host:8080;

  access_log /var/log/nginx/access.log main;

 proxy_redirect http:// $scheme://; port_in_redirect on;

  location ~/druid{
  return 404;
}

location /{
  proxy_connect_timeout 300;
  proxy_send_timeout 300;
  proxy_read_timeout 300;
  expires 10d;
  proxy_pass http://console.eayun.com ;
  proxy_set_header Host $host:$server_port;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For 
  $proxy_add_x_forwarded_for;
  proxy_set_header X-NginX-Proxy true;
}

 


說明:

使用proxy_redirect將location中的協議轉換為請求nginx的協議。

使用port_in_redirect on指示nginx使用請求的端口,而不是使用默認端口。

proxy_set_header Host $host:$server_port;很關鍵,我也不明白為啥,不設置,端口為變為80。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM