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;
}