负载均衡将https请求转发后端http服务报错:The plain HTTP request was sent to HTTPS port

https请求报错:The plain HTTP request was sent to HTTPS port


示例背景描述:

  • www.test.com:11001服务需要对互联网使用https提供服务
  • 后端java服务不支持https请求,且后端程序无法修改,仅支持http请求

问题描述:

报错如下:

解决思路:通过nginx代理

此处暂时将后端服务器设定为192.168.1.1,具体配置如下:

bash 复制代码
server {
    listen 11001;
    server_name  localhost;

    location / {
        proxy_pass http://192.168.1.1:11001/;
        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 X-Forwarded-Proto https; # 强制设置协议为 HTTPS
        proxy_set_header X-Forwarded-Port $server_port;  # 传递端口

        # 重定向修正
        proxy_redirect ~^(http://[^:/]+)(:([0-9]+))?/(.*)$ https://$host:$server_port/$4;
        proxy_redirect ~^(http://)([^/]+)/(.*)$ https://$host:$server_port/$3;

        # 可选:日志调试
        access_log /var/log/nginx/redirect_fix.log main;
        error_log /var/log/nginx/redirect_error.log debug;

		# 可选配置
        proxy_connect_timeout 60s;
        proxy_read_timeout 60s;
    }

	# 可选配置
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }

}

关键配置说明

1、proxy_redirect 正则表达式​:

bash 复制代码
proxy_redirect ~^(http://[^:/]+)(:([0-9]+))?/(.*)$ https://$host:$server_port/$4;

2、​备用规则​:​

bash 复制代码
proxy_redirect ~^(http://)([^/]+)/(.*)$ https://$host:$server_port/$3;

3、​强制协议头部​:

bash 复制代码
proxy_set_header X-Forwarded-Proto https;
  • 即使后端服务不使用这个头部,也设置它以保持一致性

测试与验证方法
1、测试配置:

bash 复制代码
nginx -t

2、重载配置:

bash 复制代码
nginx -s reload

3、监控日志:

bash 复制代码
tail -f /var/log/nginx/access.log 
tail -f /var/log/nginx/error.log
tail -f /var/log/nginx/redirect_fix.log
tail -f /var/log/nginx/redirect_error.log

4、重新访问测试

https://www.test.com:11001


常见问题排查表

问题现象 可能原因 解决方案
重定向循环 后端服务也尝试重定向 检查后端响应是否已经是HTTPS
端口号不正确 正则匹配失败 添加更通用的匹配规则
HTTPS证书错误 证书不匹配 检查SLB证书是否有效
404 错误 路径被修改 检查正则中的路径捕获组 如 4 和 3

如果上述配置仍有问题,使用这个更强大的版本:

bash 复制代码
proxy_redirect ~^http(://[^/]+)?(:\d+)?/(.*)$ https://$host:$server_port/$3;
proxy_redirect ~^http(://)([^/]+)/(.*)$ https://$host:$server_port/$3;
proxy_redirect default;

这个规则会:

  • 匹配任何以 http 开头的重定向
  • 替换为 https + 原始域名 + 11001端口
  • 保留原始路径不变

最后我想说:请不要以此视为定论,这只是我的个人经验

相关推荐
uoKent7 小时前
计网中的HTTP/HTTPS
网络协议·http·https
ControlRookie13 小时前
第22篇_源码加更 04|chunked 解码器和十六进制块长度解析
http·codesys·plc通信·开源源码
我最爱吃鱼香茄子15 小时前
【踩坑实录】若依Vue宝塔部署:验证码空白、反复提示登录状态已过期|完整排错
nginx·宝塔·若依·ruoyi‑vue·登录状态已过期
dazhong201215 小时前
Docker 进阶篇(二) Docker Compose 部署 Nginx 实践
nginx·docker·容器
且白15 小时前
node、npm通过http-server架设本地服务器(可解决跨域)
服务器·网络协议·http
hiahiahia12316 小时前
HTTP Streaming:为什么 AI 回答经常要边生成边返回?
人工智能·网络协议·http
susplus19 小时前
【HTTP协议】HTTP介绍及基础【C语言爬虫实现】
c语言·爬虫·http·万维网
xieliyu.20 小时前
计算机网络:Fiddler 抓包工具使用教程 + HTTP 协议报文格式详解
java·笔记·计算机网络·测试工具·http·java-ee·fiddler
笑梦无境20 小时前
nginx安装(5)
linux·运维·nginx
程序员夏洛20 小时前
HTTP 2.0 和 3.0 有什么区别?
网络·网络协议·http