登录
首页 >  文章 >  php教程

PHP获取真实IP地址的正确方法

时间:2026-05-29 16:28:33 354浏览 收藏

在PHP应用部署于反向代理或CDN之后,直接使用$_SERVER['REMOTE_ADDR']会错误地获取代理服务器IP而非用户真实IP;本文系统讲解了安全、可靠获取真实客户端IP的完整方案:优先信任可信代理设置的HTTP_X_REAL_IP头,其次谨慎解析HTTP_X_FORWARDED_FOR中首个合法且非私有的IP,最后才回退到REMOTE_ADDR,并强调必须结合IP格式校验、私有网段过滤及可信代理白名单机制,以防范伪造头攻击——无论你使用Nginx、CDN还是特殊SAPI环境,都能找到适配且安全的解决方案。

PHP怎么获取用户真实IP地址_PHP获取客户端IP方法【操作】

如果您的PHP应用部署在反向代理或CDN之后,直接使用$_SERVER['REMOTE_ADDR']将返回代理服务器的IP地址,而非用户真实IP。以下是获取用户真实IP地址的多种方法:

一、检查HTTP_X_FORWARDED_FOR头

当请求经过反向代理(如Nginx、Apache mod_proxy)时,代理通常会在HTTP_X_FORWARDED_FOR头中追加原始客户端IP。该头可能包含多个IP,以逗号分隔,最左侧为用户真实IP。

1、使用explode()函数分割HTTP_X_FORWARDED_FOR值,并取第一个非空、非私有IP。

2、逐个验证分割后的IP是否符合IPv4格式且不在私有地址段(127.0.0.0/8、10.0.0.0/8、172.16.0.0/12、192.168.0.0/16、100.64.0.0/10)。

3、若HTTP_X_FORWARDED_FOR不存在或无效,则回退至REMOTE_ADDR。

二、检查HTTP_X_REAL_IP头

Nginx等代理服务器在配置proxy_set_header X-Real-IP $remote_addr;后,会将用户原始IP写入HTTP_X_REAL_IP头。该头只含单个IP,无需解析,可靠性高于X-Forwarded-For。

1、读取$_SERVER['HTTP_X_REAL_IP']的值。

2、使用filter_var()配合FILTER_VALIDATE_IP验证其是否为合法IPv4或IPv6地址。

3、若验证通过且不属于私有网段,则直接采用该IP;否则忽略并尝试其他来源。

三、组合校验多个HTTP头字段

为增强兼容性,可同时检查X-Forwarded-For、X-Real-IP、X-Cluster-Client-IP等常见代理头,并按可信度降序优先选取。需注意避免伪造头带来的安全风险,仅信任来自已知可信代理的请求。

1、定义可信代理IP列表(如Nginx服务器内网地址)。

2、判断$_SERVER['REMOTE_ADDR']是否在可信代理列表中;若不在,直接返回REMOTE_ADDR。

3、若在可信列表中,依次检查X-Real-IP、X-Forwarded-For、X-Cluster-Client-IP,对每个候选IP执行filter_var($ip, FILTER_VALIDATE_IP) && !filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE)校验。

四、使用getallheaders()获取完整头信息

某些SAPI(如CLI SAPI)不填充$_SERVER中的HTTP_*变量,此时需调用getallheaders()手动提取。该函数返回所有HTTP请求头的关联数组,适用于调试和特殊部署环境。

1、检查函数是否存在:if (function_exists('getallheaders')) { $headers = getallheaders(); }。

2、从$headers中提取'X-Forwarded-For'、'X-Real-IP'等键值。

3、对提取出的值执行与前述方法一致的格式校验与私有网段过滤。

五、禁用不可信头字段的简单防御策略

若应用未部署在任何代理之后,或明确禁止外部设置代理头,则应完全忽略所有HTTP_*头,仅依赖REMOTE_ADDR。此时任何伪造的X-Forwarded-For头均不应被解析。

1、确认当前Web服务器无反向代理配置(如Nginx未启用proxy_pass,CDN未开启)。

2、直接使用$_SERVER['REMOTE_ADDR']作为唯一IP来源。

3、在代码中添加注释说明:“本环境无代理层,不解析任何HTTP头字段”。

本篇关于《PHP获取真实IP地址的正确方法》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于文章的相关知识,请关注golang学习网公众号!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>