Nginx 使用自簽名證書實現 https 反代 Spring Boot 中碰到的頁面跳轉問題

問題一:頁面自動跳轉到 80 端口

問題描述

最近在使用Nginx反代一個Spring Boot項目中碰到了一個問題,使用 Spring Boot 中的 redirect: 進行頁面跳轉的時候,通過 Nginx 反代訪問後,頁面會自動跳轉到 80 端口,導致服務無法訪問,頁面跳轉錯誤。

問題解決

出現這種問題的原因是因為在配置 location 中的 proxy_set_header Host $host; 時候,沒有加端口號,正確的配置應該是這樣的

proxy_set_header Host $host:$server_port;

問題二:頁面由 https 協議自動跳轉到 http 協議

問題描述

解決了上面的端口問題後,後面又出現自動跳轉到 http 協議的端口,例如訪問 //127.0.0.1:8082/page 會自動跳轉到 //127.0.0.1:8082/page ,導致 Nginx 報

400 Bad Request
The plain HTTP request was sent to HTTPS port

解決

出現這種問題的原因是因為在配置 location 中的 proxy_redirect 時候,設置成了 off ,沒有配置合適的跳轉協議,正確的應該是這樣

 proxy_redirect //$host:$server_port //$host:$server_port;

即將 Spring Boot 的 http 協議跳轉更換為 https 協議跳轉

此時問題解決

完整配置

         server {
           listen 8082 http2 ssl;
           ssl on;
           ssl_certificate server.crt;
           ssl_certificate_key server.key;
           ssl_session_timeout 5m;
           ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
           #請按照以下套件配置,配置加密套件,寫法遵循 openssl 標準。
           ssl_ciphers ECDHE-RSA-AES256-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
           ssl_prefer_server_ciphers on;
           location / {
                proxy_redirect //$host:$server_port //$host:$server_port;
                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 Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_set_header Origin '';
                proxy_connect_timeout 60;
                proxy_read_timeout 600;
                proxy_send_timeout 600;
               proxy_pass //127.0.0.1:8079;
           }

版權

本文首發於 //www.buguagaoshu.com/archives/nginx-shi-yong-zi-qian-ming-zheng-shu-shi-xian-https-fan-dai-springboot-zhong-peng-dao-de-ye-mian-tiao-zhuan-wen-ti 轉載請註明來源