负载均衡将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请求

问题描述:

  • 因此在访问https://www.test.com:11001,URL会跳转http://www.test.com:11001,然后报错The plain HTTP request was sent to HTTPS port

报错如下:
在这里插入图片描述

解决思路:通过nginx代理

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

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; # 强制设置协议为 HTTPSproxy_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 正则表达式​:

proxy_redirect ~^(http://[^:/]+)(:([0-9]+))?/(.*)$ https://$host:$server_port/$4;
  • 匹配任何 HTTP 重定向:http://domain:port/path 或 http://domain/path
  • 替换为:https://原始域名:11001/path

2、​备用规则​:​

proxy_redirect ~^(http://)([^/]+)/(.*)$ https://$host:$server_port/$3;
  • 匹配格式:http://anything/path
  • 替换为:https://原始域名:11001/path

3、​强制协议头部​:

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

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

nginx -t

2、重载配置:

nginx -s reload

3、监控日志:

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

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

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

这个规则会:

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/82597.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(3)Playwright自动化-3-离线搭建playwright环境

1.简介 如果是在公司局域网办公,或者公司为了安全对网络管控比较严格这种情况下如何搭建环境,我们简单来看看 (第一种情况及解决办法:带要搭建环境的电脑到有网的地方在线安装即可。 (第二种情况及解决办法&#xf…

【Fiddler抓取手机数据包】

Fiddler抓取手机数据包的配置方法 确保电脑和手机在同一局域网 电脑和手机需连接同一Wi-Fi网络。可通过电脑命令行输入ipconfig查看电脑的本地IP地址(IPv4地址),手机需能ping通该IP。 配置Fiddler允许远程连接 打开Fiddler,进入…

PublishSubject、ReplaySubject、BehaviorSubject、AsyncSubject的区别

python容易编辑,因此用pyrx代替rxjava3做演示会比较快捷。 pyrx安装命令: pip install rx 一、Subject(相当于 RxJava 的 PublishSubject) PublishSubject PublishSubject 将对观察者发送订阅后产生的元素,而在订阅前…

BLE中心与外围设备MTU协商过程详解

一、MTU基础概念​​ 1. ​​MTU定义​​ ​​最大传输单元(MTU)​​ 指单次数据传输中允许的最大字节数,包含协议头部(3字节)和有效载荷(最多517字节)。BLE默认MTU为​​23字节​​&a…

【华为云Astro-服务编排】服务编排使用全攻略

目录 概述 为什么使用服务编排 服务编排基本能力 拖拉拽式编排流程 逻辑处理 对象处理 服务单元组合脚本、原生服务、BO、第三方服务 服务编排与模块间调用关系 脚本 对象 标准页面 BPM API接口 BO 连接器 如何创建服务编排 创建服务编排 如何开发服务编排 服…

centos实现SSH远程登录

1. 生成SSH密钥对 首先,你需要在客户端机器上生成一个SSH密钥对。打开终端,执行以下命令 ssh-keygen 或ssh-keygen -t rsa -b 2048(效果相同) 按照提示操作,可以按回车键接受默认的文件名(通常是~/.ssh/id_…

定制开发开源AI智能名片S2B2C商城小程序在无界零售中的应用与行业智能升级示范研究

摘要:本文聚焦无界零售背景下京东从零售产品提供者向零售基础设施提供者的转变,探讨定制开发开源AI智能名片S2B2C商城小程序在这一转变中的应用。通过分析该小程序在商业运营成本降低、效率提升、用户体验优化等方面的作用,以及其与京东AI和冯…

ZooKeeper 安装教程(Windows + Linux 双平台)

ZooKeeper 安装教程(Windows + Linux 双平台) Zookeeper 和 Kafka 版本与 JDK 要求 一、安装前准备 系统要求 Java 环境(JDK17+)开放端口:2181(客户端),2888(集群通信),3888(选举)安装 Java Linux(Ubuntu/CentOS) # Ubuntu

【Git系列】如何同步原始仓库的更新到你的fork仓库?

🎉🎉🎉欢迎来到我们的博客!无论您是第一次访问,还是我们的老朋友,我们都由衷地感谢您的到来。无论您是来寻找灵感、获取知识,还是单纯地享受阅读的乐趣,我们都希望您能在这里找到属于…

Could not obtain transaction-synchronized Session for current thread

背景 写了一个函数,分别支持手动调用和定时任务调用。 测试的时候一直用手动点击按钮触发函数,功能可用 等到了测试定时任务的时候,后台报错 Could not obtain transaction-synchronized Session for current thread错误分析 事务管理不匹…

linux nm/objdump/readelf/addr2line命令详解

我们在开发过程中通过需要反汇编查看问题,那么我们这里使用rk3568开发板来举例nm/objdump/readelf/addr2line 分析动态库和可执行文件以及.o文件。 1,我们举例nm/objdump/readelf/addr2line解析linux 内核文件vmlinux (1),addr2…

C++自定义简单的内存池

内存池简述 在C的STL的容器中的容器如vector、deque等用的默认分配器(allocator)都是从直接从系统的堆中申请内存,用一点申请一点,效率极低。这就是设计内存池的意义,所谓内存池,就是一次性向系统申请一大片内存(预分…

【极客日常】分享go开发中wire和interface配合的一些经验

在先前一篇文章中,笔者给大家提到了go语言后端编程可以用wire依赖注入模块去简化单例服务的初始化,同时也可以解决服务单例之间复杂依赖的问题。但实事求是来讲,用wire也是有一些学习成本的,wire在帮助解决复杂依赖的问题同时&…

20250605车充安服务器受木马攻击导致服务不可用

https://mp.weixin.qq.com/s/2JyxmDIDBa9_owNjIJ6UIg 因业务服务器受木马攻击,服务器网络资源损耗,业务负载能力受损

web3-虚拟合约 vs 现实合同:权利、义务与资产的链上新秩序

web3-虚拟合约 vs 现实合同:权利、义务与资产的链上新秩序 一、智能合约vs真实世界合约 传统合约:基础要素 如下图,现实世界的合约,会有一个条款,然后下面还有一个“Alice”的签名 提出合约和接受合约; …

【面经分享】京东

线程池核心参数 7 个参数。 coreSize maxSize 阻塞队列 时间 时间 线程工厂 拒绝策略 核心参数的话,有 coreSize、阻塞队列、拒绝策略。 JVM 组成 内存上划分: 线程私有:Java 虚拟机栈,本地方法栈、Tlab、程序计数器 …

工作流引擎-11-开源 BPM 项目 jbpm

工作流引擎系列 工作流引擎-00-流程引擎概览 工作流引擎-01-Activiti 是领先的轻量级、以 Java 为中心的开源 BPMN 引擎,支持现实世界的流程自动化需求 工作流引擎-02-BPM OA ERP 区别和联系 工作流引擎-03-聊一聊流程引擎 工作流引擎-04-流程引擎 activiti 优…

深度学习在非线性场景中的核心应用领域及向量/张量数据处理案例,结合工业、金融等领域的实际落地场景分析

一、工业场景:非线性缺陷检测与预测 1. ‌半导体晶圆缺陷检测‌ ‌问题‌:微米级划痕、颗粒污染等缺陷形态复杂,与正常纹理呈非线性关系。‌解决方案‌: ‌输入张量‌:高分辨率晶圆图像 → 三维张量 (Batch, Height,…

Python-线程同步

多线程 案例 说明: 唱歌方法 sing()跳舞方法 dance()启用两个线程调用主线程结束 代码 # 导入线程模块 import threading import timedef sing(name,age):time.sleep(2)print(唱歌者姓名: name ,年龄: str(age))print(正在唱…

前端八股之JS的原型链

1.原型的定义 每一个对象从被创建开始就和另一个对象关联,从另一个对象上继承其属性,这个另一个对象就是 原型。 当访问一个对象的属性时,先在对象的本身找,找不到就去对象的原型上找,如果还是找不到,就去…