1. 程式人生 > 其它 >解決nginx https代理tomcat redirect問題 解決nginx https代理tomcat redirect問題

解決nginx https代理tomcat redirect問題 解決nginx https代理tomcat redirect問題

解決nginx https代理tomcat redirect問題

 

問題描述
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。
————————————————
版權宣告:本文為CSDN博主「juncke」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結: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。
————————————————
版權宣告:本文為CSDN博主「juncke」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/juncke/article/details/52539175