ThinkPHP在启用nginx反向代理后如何获取真实的Ip地址
直接说问题,我们在开发vue项目的时候需要奖接口操作通过本站点的Nginx做反向代理,此时如果我们直接用TP自带的request()->ip() 来区取IP时,获取到的是代理服务器的IP,而不是真正的来源IP。
一般的Ning反向代理都是这样配置的,如下:
location /merapi/ {
# 反向代理到目标URL
proxy_pass https://www.yusion.cn/merapi/;
# 以下是一些重要的代理头设置,用于正确传递原始请求信息
proxy_set_header Host $proxy_host; # 传递目标主机名
proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递转发链IP
proxy_set_header X-Forwarded-Proto $scheme; # 传递原始协议(http/https)
# 根据需要可以添加更多配置...
# 例如设置连接超时时间
proxy_connect_timeout 30s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
}
注意:X-Real-IP ,X-Forwarded-For 这两处,我们会把客户的真实IP放到这两份个header中。
我们打开request()->ip()的源码,会发现有如下配置:
public function ip(): string
{
if (!empty($this->realIP)) {
return $this->realIP;
}
$this->realIP = $this->server('REMOTE_ADDR', '');
// 如果指定了前端代理服务器IP以及其会发送的IP头
// 则尝试获取前端代理服务器发送过来的真实IP
$proxyIp = $this->proxyServerIp;
$proxyIpHeader = $this->proxyServerIpHeader;
if (count($proxyIp) > 0 && count($proxyIpHeader) > 0) {
// 从指定的HTTP头中依次尝试获取IP地址
// 直到获取到一个合法的IP地址
foreach ($proxyIpHeader as $header) {
$tempIP = $this->server($header);
if (empty($tempIP)) {
continue;
}
$tempIP = trim(explode(',', $tempIP)[0]);
if (!$this->isValidIP($tempIP)) {
$tempIP = null;
} else {
break;
}
}
// tempIP不为空,说明获取到了一个IP地址
// 这时我们检查 REMOTE_ADDR 是不是指定的前端代理服务器之一
// 如果是的话说明该 IP头 是由前端代理服务器设置的
// 否则则是伪装的
if (!empty($tempIP)) {
$realIPBin = $this->ip2bin($this->realIP);
foreach ($proxyIp as $ip) {
$serverIPElements = explode('/', $ip);
$serverIP = $serverIPElements[0];
$serverIPPrefix = $serverIPElements[1] ?? 128;
$serverIPBin = $this->ip2bin($serverIP);
// IP类型不符
if (strlen($realIPBin) !== strlen($serverIPBin)) {
continue;
}
if (strncmp($realIPBin, $serverIPBin, (int) $serverIPPrefix) === 0) {
$this->realIP = $tempIP;
break;
}
}
}
}
if (!$this->isValidIP($this->realIP)) {
$this->realIP = '0.0.0.0';
}
return $this->realIP;
}
大家注意看这一行代码:
if (count($proxyIp) > 0 && count($proxyIpHeader) > 0)
TP是有考虑过反向代理的问题。但是,但是! 你这个$proxyIpHeader有定义内容。$proxyIp = $proxyServerIP ,你这个类却没有给定义方法。这玩的是哪出?
如上图,整个文件都没有方法。think\Request.php ,这玩笑开的。
所以交们要用,只能自己去写一个方法,如下 :
namespace app\common\extend;
use think\Request;
class SysRequest extends Request{
public function setProxyIp($ip){
array_push($this->proxyServerIp,$ip);
}
}
重构一个类,继承Request ,自己写一个方法,来改变proxyServerIp的值。
因为这个代理服务器的IP最好的要指定的,否则容易获取不准(原因自己看源码)。
1. 直接实现化这个类。
2. 写一个方法。我用第二种。
if(!function_exists('get_client_ip')) {
/**
* 获取ip地址
* @param $proxyServiceId 反向代理服务器Ip
* @auther Hotlinhao
* @createAt 2025/9/18 17:48
* @return void
*/
function get_client_ip($proxyServiceId = ''){
$request = app()->make(\app\common\extend\SysRequest::class);
if(!empty($proxyServiceId)){
$request->setProxyIp($proxyServiceId);
}
//从配置文件中找有没有设置反向代理服务器ip地址
$ips = sys_config('proxy_ip');
if(!empty($ips)){
$arr = explode("\n",$ips);
foreach ($arr as $ip){
if($request->isValidIP($ip)){
$request->setProxyIp($ip);
}
}
}
return $request->ip();
}
}
因为我的代理服务器IP地址是配置后台了,所以可以从配置文件中获取(sys_cofnig(),你的没有自己想办法)。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/916129.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!相关文章
CentOS 7 下 Kubernetes 集群搭建与配置指南
环境准备
系统要求至少3台CentOS 7服务器(1个Master,2个Worker节点)每台服务器至少2GB RAM,2核CPU所有节点间网络互通关闭防火墙和SELinux(生产环境请按需配置)主机规划示例 主机名IP地址角色k8s-master
192.168…
wpf 自定义输入ip地址的文本框 - 详解
pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …
网站建设图文做营销网站视频
【JavaEE】Spring Boot 开发要点总结(3) 文章目录 【JavaEE】Spring Boot 开发要点总结(3)1. 日志有什么作用2. 日志格式2.1 日志框架原理 3. 日志的打印3.1 System.out.println3.2 使用日志框架3.3 日志级别3.3.1 设置默认日志显…
模板式自助建站wordpress ping服务器
git误操作带来的麻烦-merge 我想将一个分支的内容完全覆盖远程另外一个分支的内容怎么做
如果你想将一个本地分支(我们称之为source-branch)的内容完全覆盖远程的另一个分支(我们称之为target-branch),可以按照以下步…
徐州做网站最好的公司网站在线制作软件
前言:希望通过本文,使MySQL5.7.18的使用者知晓分区表使用中存在的陷阱,避免在该版本上继续踩坑。同时通过对源码的分享,升级MySQL5.7.18时分区表性能下降的根本原因,向MySQL源码爱好者展示分区表实现中锁的运用。问题描…
【macOS】垃圾箱中文档无法清理的“含特殊字符文件名”的技巧
pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …
公司网站简介开发定制软件系统
文章目录 象棋王子电子木鱼BabyGo 象棋王子 考点:前端js代码审计 直接查看js源码,搜一下alert 丢到控制台即可
电子木鱼 考点:整数溢出 main.rs我们分段分析
首先这段代码是一个基于Rust的web应用程序中的路由处理函数。它使用了Rust的异步…
Git 工作树 (worktree)、合并 (merge) 流程、拉取请求 (PR) 机制,以及基线分支概念
提升效率:掌握 Git 工作流中的高阶技巧与基线管理在团队协作和复杂项目开发中,高效使用 Git 远不止 commit 和 push 这么简单。掌握 git worktree、规范的合并流程和 PR 机制,是提升开发效率的关键。本文将为您梳理…
【HD300I 】基于昇腾 310P 的全国产化智能计算模组
产品概述
HD300I 是一款基于昇腾 310P 的全国产化智能计算模组。该模 组将昇腾 310P 芯片集成在了一个 140*80mm 的板卡上,可以作为一 个紧凑的核心模块,进行功能的扩展,能够快速搭建起一个 AI 边缘智 能计算推理的…
mvc做的网站如何发布访问新建网站的评估
2019独角兽企业重金招聘Python工程师标准>>> 俗话说的好啊,“工于利启事,必先善其器”,如果说你的编程功底是一个枪法的话,那么强大的eclipse就是android战士们最好的武器。 这里,我们来总结eclipse的使用技…
新手做网站详细步骤公司装修免费设计
大家好我是苏麟 , 今天聊聊怎么继续使用Java8做项目 . 在做项目的时候突然发现Java8没了 , 我心想 : " 嗯? IDEA出毛病了?" ,经过我仔细检查原来是spring官方不支持Java8了 . IDEA 内置的 Spring Initializr 创建 Spring Boot 新项目时,没有 Java 8 的选…
《密码系统设计》第三周
20231313 张景云《密码系统设计》第三周预习AI对内容的总结
《嗨翻C语言》第四章内容总结
一、多源文件开发核心思想:分而治之
大型程序无需局限于单个源文件,将源代码拆解为小模块(多个源文件),可大幅降低维护难…
详细介绍:Cloudflare 推出 GenAI 安全工具,守护企业数据
详细介绍:Cloudflare 推出 GenAI 安全工具,守护企业数据pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consola…
惠州市+网站开发公司福州做网站建设
如何测试光纤网速?如何测试网速多少兆网速测试的选择有很多,你在安装宽带的时候,网络提供商可能给你介绍到什么网站或者下载什么软件进行网速测试。而不管你使用什么来测试网速,你都不应该只使用一个方法,正确的做法是使用多个方…
宁波网站建设在哪里the7企业中 英文wordpress模板
Moved to http://blog.tangcs.com/2008/06/15/pinvoke-and-marshaling-data-1/转载于:https://www.cnblogs.com/WarrenTang/archive/2008/06/15/1222750.html
论小学教师转移矛盾的方法——以“小组连坐制”为例
前言
本文旨在探讨小学教师转移自己与学生之间矛盾的方法。经过一段时间的教学以后,学生与教师难免产生一些矛盾,而防止冲突的最简单方法就是将矛盾转移出去——毕竟大部分小学生还没有经过系统性的思辨训练,很容易…
VS2022 不支持 .NET Framework 4.0 的解决方法
Visual Studio 2022 默认不再支持 .NET Framework 4.0,这可能导致旧项目无法正常加载或编译。以下是解决此问题的几种方法。示例问题当尝试打开基于 .NET Framework 4.0 的项目时,可能会出现以下错误提示:找不到 .N…
【Origin】数据分析后的图,提取到外部图表
1、想要提取的图2、左边窗口还原,再双击打开该均值图,使其浮动3、在浮窗上右键,点击创建副本即可,左边出现绘图副本 Love for Ever Day
怎么做钓鱼网站万网个人网站
题目描述 小明家住在一条胡同里。胡同里的门牌号都是连续的正整数,由于历史原因,最小的号码并不是从1开始排的。 有一天小明突然发现了有趣的事情: 如果除去小明家不算,胡同里的其它门牌号加起来,刚好是100!…