当前位置:首页 > 云服务器

php获取本机ip在thinkphp中差异_thinkphp取ip教程【步骤】

游戏科技网2026年09月14日 23:44云服务器20
描述:ThinkPHP 6 中 request()->ip() 返回127.0.0.1或内网IP,是因为默认仅信任REMOTE_ADDR,反向代理时需配置trust_proxies数组指定可信代理段,否则忽略X-Forwarded-For/X-Real-IP头。ThinkPHP 6 中 reques…
ThinkPHP 6 中 request()->ip() 返回127.0.0.1或内网IP,是因为默认仅信任REMOTE_ADDR,反向代理时需配置trust_proxies数组指定可信代理段,否则忽略X-Forwarded-For/X-Real-IP头。

php获取本机ip在thinkphp中差异_thinkphp取ip教程【步骤】

ThinkPHP 6 中 request()->ip() 返回 127.0.0.1 或内网 IP 怎么办

直接原因:TP6 默认只从 REMOTE_ADDR 取 IP,而 Nginx/Apache 反向代理后,真实客户端 IP 被写入 X-Forwarded-ForX-Real-IP,但框架未自动信任这些头字段。

解决前提是明确部署环境是否启用反向代理(如 Nginx → PHP-FPM):

  • 没用反代(PHP 直连公网)→ request()->ip() 通常正确
  • 用了反代(常见于宝塔、Docker、云服务器 Nginx 配置)→ 必须手动配置可信代理 IP 段

config/app.php 中添加或修改:

1

trust_proxies => [127.0.0.1, 192.168.0.0/16, 10.0.0.0/8],

注意:trust_proxies 是数组,支持 CIDR 写法;若用宝塔,Nginx 的 proxy_set_header X-Real-IP $remote_addr; 必须存在,且 PHP 所在机器 IP 必须落在该数组中,否则 TP 会忽略所有代理头。

立即学习PHP免费学习笔记(深入)”;

为什么 $_SERVER[REMOTE_ADDR]request()->ip() 结果不一致

根本区别在于数据来源和处理逻辑:

  • $_SERVER[REMOTE_ADDR] 是 CGI 协议层原始值,由 Web 服务器(如 Nginx)直接设置,不受 PHP 代码影响
  • request()->ip() 是 ThinkPHP 封装方法,内部按顺序检查:X-Forwarded-ForX-Real-IPREMOTE_ADDR,但**仅当客户端 IP 属于 trust_proxies 列表时,才接受前两个头**

典型错误场景:

php获取本机ip在thinkphp中差异_thinkphp取ip教程【步骤】
Nginx Proxy Manager

管理 Nginx Proxy Manager(NPM)的主机、证书和访问列表,用于添加域名、指向服务器/端口、启用 SSL 或查看代理主机状态。

下载
  • Nginx 配了 X-Real-IP,但 trust_proxies 没包含 Nginx 所在 IP → TP 强制回退到 REMOTE_ADDR(即 127.0.0.1)
  • 多级代理(如 CDN + Nginx),X-Forwarded-For 有多个 IP,TP 默认取第一个,但若首段不可信,需配合 trust_proxies 向前跳过

获取“真正用户公网 IP”的安全写法(防伪造)

不能无条件信任 X-Forwarded-For,因为客户端可伪造该 Header。可靠做法是:只信任你控制的上一级代理所附加的值。

推荐封装一个辅助函数(放在 app/common/Helper.php):

1

2

3

4

5

6

7

8

9

10

11

function get_client_ip(): string

{

    $request = \think\Request::instance();

    // 强制走 TP 的 IP 解析逻辑,但确保 trust_proxies 已配好

    $ip = $request->ip();

    // 补充校验:排除私有地址和保留地址

    if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {

        $ip = 0.0.0.0;

    }

    return $ip;

}

关键点:

  • 不要自己 parse X-Forwarded-For 字符串 —— TP 已处理好层级和信任链
  • FILTER_FLAG_NO_PRIV_RANGE 排除 10.x、172.16–31.x、192.168.x 等内网段
  • FILTER_FLAG_NO_RES_RANGE 排除 0.0.0.0、127.0.0.0/8、169.254.0.0/16 等保留地址

ThinkPHP 5.1 和 6.x 在 IP 获取上的主要差异

TP5.1 没有 trust_proxies 配置项,其 request()->ip() 默认信任所有代理头,存在被伪造风险;TP6 引入该配置后更安全,但也更“严格”。

迁移注意事项:

  • TP5.1 升级到 TP6,必须补全 trust_proxies 配置,否则线上 IP 全变 127.0.0.1
  • TP6 中 request()->ip(true) 表示“返回真实 IP(跳过代理头)”,等价于直接读 $_SERVER[REMOTE_ADDR],慎用
  • TP6.3+ 支持 request()->realIP() 方法,功能同 ip() 但语义更明确,建议新项目使用

最易被忽略的一点:本地开发用 php think run 时,没有 Nginx,trust_proxies 应设为空数组或注释掉,否则可能干扰调试。

“php获取本机ip在thinkphp中差异_thinkphp取ip教程【步骤】” 的相关文章

5元云服务器:入门级新手首选

5元云服务器:入门级新手首选 我是一名刚毕业的大学生,对编程充满了热情,但现实总是骨感一些。刚踏入职场,我梦想着能独立开发一个网站或应用,却苦于没有足够的资源。买一台实体服务器太贵,租个虚拟空间又觉得…

6元服务器租用,高性价比VPS主机推荐

6元服务器租用,高性价比VPS主机推荐 记得去年我刚开始创业,做了一个小型网站来展示我的产品。那时,我手头紧,预算有限,却急着需要一个可靠的服务器来托管网站。作为一个普通上班族,我对技术懂得不多,但我…

2021年云服务器优惠套餐推荐

2021年云服务器优惠套餐推荐 嗨,朋友们!你是否曾经在深夜里,面对一堆代码和服务器错误,感叹说:“为什么我的项目老是卡顿?”如果是这样的话,那你可能正在寻找2021年云服务器优惠套餐的解决方案。作为…

1元买走一台云服务器,这种天上掉馅饼的事存在吗?

1元买走一台云服务器,这种天上掉馅饼的事存在吗? 那天,我在咖啡馆里刷手机,偶然看到一个广告:“只需1元,就能买走一台高性能云服务器!容量无限,稳定快速,适合创业和学习。”我的心跳突然加速了。作为一个…

云服务器10元月:经济型服务价格新记录

云服务器10元/月:经济型服务价格新记录 最近,云服务器的价格被推向了一个新低,10元一个月的方案让许多人惊喜不已。这不仅仅是数字上的变化,更是科技服务普惠化的一个标志。云服务器作为一种基于云计算的虚…

盘点最新优惠 云服务器网站推荐

盘点最新优惠 云服务器网站推荐 探盘最新优惠 云服务器网站推荐 云计算技术的迅猛发展,使得云服务器成为企业和个人开发者不可或缺的基础设施。云服务器,作为一种基于虚拟化技术的计算资源,允许用户按需获取计…