yii2项目使用frp https2http插件问题

news/2024/5/3 23:12:19/文章来源:https://blog.csdn.net/sjg20010414/article/details/129375480

yii2内网项目,使用frp进行内网穿透,使用 https2http插件把内网服务器http流量转成https,会存在一个问题:当使用 $this->redirect(...) 或 $this->goHome() (其实用的也是前者)等重定向时,网址会变成 127.0.0.1,并且协议也从https变成了 http,结果自然是显示找不到

frp client配置类似官网例子:

[common]
server_addr = 47.xx.xxx.xx
server_port = 7900[web_https]
type = https
custom_domains = lab.xxxxx.complugin = https2http
plugin_local_addr = 127.0.0.1:80plugin_crt_path = ./xxxxx.com.pem
plugin_key_path = ./xxxxx.com.key
plugin_host_header_rewrite = 127.0.0.1
plugin_header_X-From-Where = frp

比较通过域名 https://lab.xxxxx.com:8900 访问和通过IP地址访问时 $_SERVER 超级全局变量的结果差异,主要有以下差异:

$_SERVER = Array
([HTTP_X_FROM_WHERE] => frp[HTTP_X_FORWARDED_FOR] => 47.xx.xxx.xx[HTTP_SEC_FETCH_USER] => ?1[HTTP_SEC_FETCH_SITE] => same-origin[HTTP_SEC_FETCH_MODE] => navigate[HTTP_SEC_FETCH_DEST] => document[HTTP_SEC_CH_UA_PLATFORM] => "Linux"[HTTP_SEC_CH_UA_MOBILE] => ?0[HTTP_SEC_CH_UA] => "Chromium";v="110", "Not A(Brand";v="24", "Google Chrome";v="110"[HTTP_REFERER] => https://lab.xxxxx.com:8900/[HTTP_HOST] => 127.0.0.1[SERVER_ADDR] => 127.0.0.1[REMOTE_ADDR] => 127.0.0.1
)
$_SERVER = Array
([HTTP_CONNECTION] => keep-alive[HTTP_HOST] => 10.5.10.200[SERVER_ADDR] => 10.5.10.200[REMOTE_ADDR] => 10.5.21.241
)

前一个是frp代理后的结果,后一个是内网直接访问的结果,我们用下图来表示这个过程

用frp内网穿透,是某种形式的反向代理。frp server只起到转发作用,它的配置非常简单,也就指定一下“主控”端口和https监听端口。使用https2http插件时,证书是配置在frp client的(即需要把通常放在公网frp server服务器的证书放一份在frp client,这里也说明frp只适合绝对信得过的client使用该插件)。frp client 上的证书,既用于frp server转发过来的流量的解密(变成http流量转发给nginx),也用于nginx响应的流量的加密(变成https流量转发给frp server,并最终响应给用户)。

我们可以发现,对于nginx来说,它的“客户”是frp client,从IP地址来说,这里的frp client “客户”地址(REMOTE_ADDR)和这里的 server nginx地址(SERVER_ADDR)都是127.0.0.1,相当于“客户”frp client,主机Host也是 127.0.0.1。不过头部中的主机信息 HTTP_HOST 是可以被重写的,对于 http 代理是配置 host_header_rewrite,而对于我们的 https2http插件,需要在 frp client配置 plugin_host_header_rewrite来重写主机Host信息。(frp client中配置 plugin_header_X-xxxx-xxx形式的头部信息,对应了 HTTP_X_xxxx_xxx 形式的头部,只是在我们的情形中,配置 HTTP_HOST、HTTP_X_FORWARDED_HOST、HTTP_PROTO、HTTP_X_FORWARDED_PORT等都不能解决问题)

了解了frp代理的基本原理,我们需要来了解yii2中redirect是怎么进行的。

yii2 redirect 所需的URL信息可以分为两个部分:第一部分是 协议、主机、端口,这部分根据yii\web\Request::getHostInfo() 函数确定;第二部分是相对于文档根的路径,由 Url::to($url)计算得到。我们关心前面的部分,代码如下

    public function getHostInfo(){if ($this->_hostInfo === null) {$secure = $this->getIsSecureConnection();$http = $secure ? 'https' : 'http';if ($this->getSecureForwardedHeaderTrustedPart('host') !== null) {$this->_hostInfo = $http . '://' . $this->getSecureForwardedHeaderTrustedPart('host');} elseif ($this->headers->has('X-Forwarded-Host')) {$this->_hostInfo = $http . '://' . trim(explode(',', $this->headers->get('X-Forwarded-Host'))[0]);} elseif ($this->headers->has('X-Original-Host')) {$this->_hostInfo = $http . '://' . trim(explode(',', $this->headers->get('X-Original-Host'))[0]);} elseif ($this->headers->has('Host')) {$this->_hostInfo = $http . '://' . $this->headers->get('Host');} elseif (isset($_SERVER['SERVER_NAME'])) {$this->_hostInfo = $http . '://' . $_SERVER['SERVER_NAME'];$port = $secure ? $this->getSecurePort() : $this->getPort();if (($port !== 80 && !$secure) || ($port !== 443 && $secure)) {$this->_hostInfo .= ':' . $port;}}}return $this->_hostInfo;}

代码的基本执行路径如下:

解决方案一:

frp client配置中,指定

 plugin_host_header_rewrite = lab.xxxxx.com:8900

这样,frp client 转发到 nginx 时,头部信息 HTTP_HOST 会被改写成设定的值,从而 getHostInfo 执行时会走路径4 (读取头部 Host信息的紫色路径),但仅仅这样是不行的,因为我们需要协议是 https,而 getIsSecureConnection 根据超级全局变量 $_SERVER['HTTPS'] 或者头部信息Forwarded中的proto部分来决定是https还是http(转发时不存在https到http切换会比较简单,因为不需要考虑这一步)。我们一种变通方法是在 yii2 入口文件中,直接指定 $_SERVER['HTTPS']=1(当然,为了兼容内网ip地址访问,可以判断 $_SERVER['SERVER_ADDR']和$_SERVER['REMOTE_ADDR']是否同时为127.0.0.1,因为我们的自我转发中,这是特点)

if ($_SERVER['SERVER_ADDR'] === '127.0.0.1' && $_SERVER['REMOTE_ADDR'] === '127.0.0.1') {  // 是内网穿透自身代理而来的请求$_SERVER['HTTPS'] = '1';  //
}
$application->run();

解决方案二:

frp client配置中,不指定 plugin_host_header_rewrite,但额外指定

plugin_header_Forwarded = for=47.xx.xxx.xx;host=lab.xxxxx.com:8900;proto=https

然后在 yii2 的配置中,对组件 request 添加配置(下面 baseUrl后面部分)

            'baseUrl' => '/admin',  //-----------后端基础目录'trustedHosts' => [  // https://www.yiiframework.com/doc/api/2.0/yii-web-request#$secureHeaders-detail'127.0.0.1/24',  // 从代理转发的,这里设置白名单,这样 $secureHeaders 中的 X-Forwarded-Host 等头部才被允许],'secureHeaders' => [  // frp配置: plugin_header_Forwarded = 'Forwarded',    // 我们添加的 集合了各项 forwarded, 参考 yii\web\Request::getSecureForwardedHeaderParts()'X-Forwarded-For','X-Forwarded-Host','X-Forwarded-Proto','X-Forwarded-Port','Front-End-Https','X-Rewrite-Url','X-Original-Host',],

这样配置后,frp client 转发时会带上头部 Forwarded,并且这个Forwarded头部将被 yii2 允许(转发主机白名单,可接受头部等)。从而,代码执行流程会按前面图中红色路径走。

路径2、3、5也可以考虑,不过和第一个方案一样,需要指定 $_SERVER['HTTPS'] = 1来指定协议,而且端口不一定好处理。

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

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

相关文章

物联网毕设 -- 智能厨房监测系统(改)

前言 在家庭生活中,厨房是必不可少的,所以厨房的安全问题关乎着我们大家的生命,所以提出智能厨房监测系统,目的就是为我们减少不必要的安全问题 ⚠️⚠️(本文章仅提供思路和实现方法,并不包含代码&#x…

javaWeb在线考试系统

一、项目简介 本项目是一套javaWeb在线考试系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse 确保…

DBeaver连接mysql、oracle数据库

1. DBeaver连接mysql 1) 下载DBeaver https://dbeaver.io/download/,并安装 2) 新建数据库连接 3)选择mysql驱动程序 4)填写连接设置内容 5)点击 “编辑驱动设置”,并填写相关信息 6)选择本地…

厦大纪老师chatgpt相关讲座3.7

在线更新数据,迭代学习训练,进而提高模型性能。 比较明显的是API部分,这一步学习的就是intruction,实现人机写作的复杂系统工程 数据充足,维基类似于百度百科 transformer结构更有优势,预测下一个字,模型越…

优思学院|盘点,精益生产25个工具!【必需收藏】

精益生产方法需要一种全面的方法才能有效实施。精益这个概念是每个接触产品供应链的人都要实践的,无论是在计划方面还是在分析方面。 精益生产工具有助于持续改进生产效率和产品或服务质量。精益工具是要减少 Muda (浪费),从生产过…

6.4 深度负反馈放大电路放大倍数的分析

实用的放大电路中多引入深度负反馈,因此分析负反馈放大电路的重点是从电路中分离出反馈网络,并求出反馈系数 F˙\pmb{\dot F}F˙。 一、深度负反馈的实质 在负反馈放大电路的一般表达式中,若 ∣1A˙F˙∣>>1|1\dot A\dot F|>>1…

FPGA使用GTX实现SFP光纤收发SDI视频 全网首创略显高端 提供工程源码和技术支持

目录1、前言2、设计思路和框架3、vivado工程详解4、上板调试验证并演示5、福利:工程代码的获取1、前言 FPGA实现SDI视频编解码目前有两种方案: 一是使用专用编解码芯片,比如典型的接收器GS2971,发送器GS2972,优点是简…

MCM 箱模型建模方法及大气 O3 来源解析实用干货

OBM 箱模型可用于模拟光化学污染的发生、演变过程,研究臭氧的生成机制和进行敏感性分析,探讨前体物的排放对光化学污染的影响。箱模型通常由化学机理、物理过程、初始条件、输入和输出模块构成,化学机理是其核心部分。MCM (Master Chemical M…

机器学习中的数学——精确率与召回率

在Yolov5训练完之后会有很多图片,它们的具体含义是什么呢? 通过这篇博客,你将清晰的明白什么是精确率、召回率。这个专栏名为白话机器学习中数学学习笔记,主要是用来分享一下我在 机器学习中的学习笔记及一些感悟,也希…

自动化框架如何搭建?让10年阿里自动化测试老司机帮你搞定!自动化测试脚本怎么写?

一、何为框架?何为自动化测试框架? 无论是日常技术交流,还是在自动化测试实践中,经常会听到一个词叫:框架。之前对“框架”这个词知其然不知其所以然。现在看过一些资料以及加上我自己的一些实践有了我自己的一些看法…

日常文档标题级别规范

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

MySQL面试题-日志

目录 1.MySQL 中常见的日志有哪些? 2.慢查询日志有什么用? 3.binlog 主要记录了什么? 4.Mysql的binlog有几种录入格式?分别有什么区别? 5.redo log 如何保证事务的持久性? 6.页修改之后为什么不直接刷…

【三.项目引入axios、申明全局变量、设置跨域】

根据前文《二.项目使用vue-router,引入ant-design-vue的UI框架,引入less》搭建好脚手架后使用 需求: 1.项目引入axios 2.申明全局变量 3.设置跨域 简介:axios本质上还是对原生XMLHttpRequest的封装,可用于浏览器和nodejs的HTTP客…

MySQL OCP888题解041-删除存储过程的权限

文章目录1、原题1.1、英文原题1.2、中文翻译1.3、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3.1、知识点1:GRANT和REVOKE的允许权限4、实验4.1、实验14.1.1、实验目的4.1.2、实验前准备4.1.3、实验步骤4.1.4、实验结论5、总结1、原题 1.1、英文原题 The…

12N60-ASEMI高压MOS管12N60

编辑-Z 12N60在TO-220封装里的静态漏极源导通电阻(RDS(ON))为0.7Ω,是一款N沟道高压MOS管。12N60的最大脉冲正向电流ISM为48A,零栅极电压漏极电流(IDSS)为1uA,其工作时耐温度范围为-55~150摄氏度。12N60功耗&#xff…

利用 socket.io 实现前后端实时交互

官网地址:Socket.IO 项目结构: 服务端(node)代码: 首先安装 express,socket.io npm i express,socket.io -S/server/index.js // 官网用例:https://socket.io/zh-CN/docs/v4/server-initial…

uniapp在线升级关联云空间

升级中心 uni-upgrade-center - App: https://ext.dcloud.net.cn/plugin?id4542 App升级中心 uni-upgrade-center文档: https://uniapp.dcloud.net.cn/uniCloud/upgrade-center.html#uni-upgrade-center-app 升级中心 uni-upgrade-center - Admin&#…

day59反刍笔记

1.本地环境安装vue后,没有vue.js文件,只有vue.cjs.js文件, 引用后也无法正常使用,看npm install vue后的文件夹中没有vue.js文件_找不到vue.js_一枝风的博客-CSDN博客 老哥的博客后得到启发,将原本的命令由&#xff1…

2023级社科院与杜兰大学金融管理硕士还有少量名额,期待与你共谱人生新篇章

我们都是平凡人,过着平凡的生活,但若能有所热爱有所坚持,便会发出自己的光芒。就像我们在社科院与杜兰大学金融管理硕士项目读研,通过更加系统的学习,不仅丰富了我们的知识,还提升了我们的思维,…

Umi + React + Ant Design Pro 项目实践(一)—— 项目搭建

学习一下 Umi、 Ant Design 和 Ant Design Pro 从 0 开始创建一个简单应用。 首先,新建项目目录: 在项目目录 D:\react\demo 中,安装 Umi 脚手架: yarn create umi # npm create umi安装成功: 接下来,…