Nginx 使用自签名证书实现 https 反代 Spring Boot 中碰到的页面跳转问题

时间:2022-11-04 12:09:06

问题描述

最近在使用Nginx反代一个Spring Boot项目中碰到了一个问题,使用 Spring Boot 中的 redirect: 进行页面跳转的时候,通过 Nginx 反代访问后,页面会自动跳转到 80 端口,导致服务无法访问,页面跳转错误。

问题解决

出现这种问题的原因是因为在配置 location 中的 proxy_set_header Host $host; 时候,没有加端口号,正确的配置应该是这样的

proxy_set_header Host $host:$server_port;

问题二:页面由 https 协议自动跳转到 http 协议

问题描述

解决了上面的端口问题后,后面又出现自动跳转到 http 协议的端口,例如访问 https://127.0.0.1:8082/page 会自动跳转到 http://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 http://$host:$server_port https://$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 http://$host:$server_port https://$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 http://127.0.0.1:8079;
           }

版权

本文首发于 https://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 转载请注明来源