Nginx HTTP转HTTPS重定向报400错误,如何修复请求发至HTTPS端口问题?
问题分析与修复方案
错误根源
- 流量路径错误:你直接访问了应用的
8080端口,而不是Nginx监听的80端口,导致Nginx的HTTP转HTTPS重定向规则完全没生效。 - 应用端口配置矛盾:应用的
8080端口实际被配置为HTTPS监听,当收到纯HTTP请求时,就会返回400 Bad Request(提示The plain HTTP request was sent to HTTPS port)。
修复方案
方案1:使用正确的Nginx入口访问(推荐)
你应该通过Nginx的80端口发起HTTP请求,而不是直接访问应用的8080端口。此时Nginx会自动执行301重定向到应用的HTTPS端口,最终返回200。
测试命令:
curl -IL http://app1.internal.example.com
预期结果:先返回301 Moved Permanently,随后跳转到https://app1.internal.example.com:8443并返回200 OK。
方案2:修复应用的8080端口配置
如果你的应用确实需要通过8080端口提供HTTP服务,检查应用配置文件,确保8080端口绑定的是HTTP协议,而非HTTPS协议。解除该端口的SSL/TLS配置后,纯HTTP请求即可正常返回内容。
方案3:让Nginx接管应用的8080端口
如果希望所有流量都经过Nginx处理,新增一个监听8080端口的server块,将该端口的HTTP请求重定向到HTTPS:
server { listen 8080; listen [::]:8080; server_name app1.internal.example.com; return 301 https://app1.internal.example.com:8443$request_uri; }
修改完成后重启Nginx,此时访问http://app1.internal.example.com:8080会被Nginx重定向到HTTPS端口,最终返回200。
额外优化:修正Nginx 443端口代理配置
当前Nginx的443端口代理指向http://localhost:5000,但你的应用实际在8443端口提供HTTPS服务,需调整代理地址并补充HTTPS代理相关配置:
server { listen 443 ssl; listen [::]:443 ssl; server_name app1.internal.example.com; # 配置你的SSL证书路径 ssl_certificate /path/to/your/cert.pem; ssl_certificate_key /path/to/your/key.pem; location ^~ / { proxy_pass https://localhost:8443; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_redirect off; # 确保代理HTTPS时正确解析服务器名称 proxy_ssl_server_name on; } }
内容的提问来源于stack exchange,提问作者uberrebu
相关产品推荐
相关产品推荐

