Nginx反向代理HTTP端口配置后仍返回400错误(The plain HTTP request was sent to HTTPS port)求助
Nginx反向代理HTTP端口配置后仍返回400错误(The plain HTTP request was sent to HTTPS port)求助
看起来你遇到的这个问题挺典型的,我来帮你梳理下可能的原因和解决方向:
1. 排查是否存在冲突的Server块
最常见的原因是有另一个Server块也监听了8080端口,并且配置了SSL,导致Nginx把你的HTTP请求错误匹配到了那个HTTPS的Server块里。
你可以用这个命令查看Nginx加载的完整生效配置(包括所有include的子配置):
nginx -T
仔细搜索输出里的listen 8080,看看有没有其他Server块是listen 8080 ssl;的形式——如果有的话,要么修改那个块的监听端口,要么给你的HTTP Server块加上default_server参数,确保它优先匹配请求:
listen 8080 default_server;
2. 确保SSL配置完全失效
虽然你注释了SSL证书相关的配置,也加了ssl off;,但有时候Nginx可能会继承上层配置(比如http块里的全局SSL设置),或者残留的配置片段仍在生效。你可以尝试在Server块里明确清空证书路径:
ssl_certificate ""; ssl_certificate_key "";
这样能彻底切断这个Server块和SSL配置的关联。
3. 验证后端IIS服务器的配置
会不会是后端的IIS服务器本身把8080端口配置成了HTTPS监听?你可以直接访问后端服务器的http://[server name]:8080,如果直接访问也返回同样的400错误,那问题就出在后端IIS的端口配置上,需要调整IIS的站点绑定,确保8080端口是HTTP协议。
4. 重启Nginx并清理缓存
修改配置后,一定要确保Nginx正确加载了新配置:
- 先测试配置语法是否正确:
nginx -t
- 语法没问题的话,重启Nginx(reload有时候可能不生效,建议直接重启):
systemctl restart nginx # 适用于systemd系统 # 或者 nginx -s stop && nginx # 通用方式
另外,浏览器的缓存可能会强制用HTTPS访问,建议用无痕模式测试,或者清空浏览器缓存后再试。
给你一个调整后的参考配置:
server { listen 8080 default_server; server_name [SITE]; ssl off; ssl_certificate ""; ssl_certificate_key ""; location / { proxy_http_version 1.1; proxy_pass http://[server name]:8080; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 建议加上,方便后端记录真实请求IP } }
备注:内容来源于stack exchange,提问作者happybovine
相关产品推荐
相关产品推荐

