php中HTTP_X_FORWARDED_FOR 和 REMOTE_ADDR

本文介绍了一种通过PHP脚本来获取客户端真实IP地址的方法,尤其适用于客户端通过代理服务器访问的情况。文章提供了一个实用的函数,该函数能根据不同的环境变量获取真实的客户端IP地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.REMOTE_ADDR:浏览当前页面的用户计算机的ip地址
2.HTTP_X_FORWARDED_FOR: 浏览当前页面的用户计算机的网关
3.HTTP_CLIENT_IP:客户端的ip

在PHP 中使用 $_SERVER["REMOTE_ADDR"] 来取得客户端的 IP 地址,但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的 IP 地址,而不是真正的客户端 IP 地址。要想透过代理服务器取得客户端的真实 IP 地址,就要使用 $_SERVER["HTTP_X_FORWARDED_FOR"] 来读取。

function ip() {
    if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
        $ip = getenv('HTTP_CLIENT_IP');
    } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
        $ip = getenv('HTTP_X_FORWARDED_FOR');
    } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
        $ip = getenv('REMOTE_ADDR');
    } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    return preg_match ( '/[\d\.]{7,15}/', $ip, $matches ) ? $matches [0] : '';
}

### 正确配置 Nginx 反向代理规则 为了正确设置 Nginx 的反向代理规则 `proxy_pass` 并处理相关的头部信息(如 Host、X-Real-IP X-Forwarded-For),可以按照以下方式完成。 #### 1. 基本概念说明 Nginx 中的 `proxy_set_header` 指令用于修改或添加发送给后端服务器的 HTTP 请求头字段。这在反向代理场景下非常重要,因为它可以帮助保留原始客户端的信息并增强安全性[^1]。 对于 API 请求来说,通常需要关注以下几个关键点: - **Host**: 后端服务可能依赖于主机名来路由请求。 - **X-Real-IP**: 记录真实的客户端 IP 地址。 - **X-Forwarded-For**: 跟踪经过多个中间节点后的客户端真实地址链路。 #### 2. 配置实例解析 以下是标准的 Nginx 配置模板: ```nginx server { listen 80; server_name api.example.com; location /api/ { proxy_pass http://backend_server; # 替换为目标API的实际URL # 设置Host头为原始请求中的Host值 proxy_set_header Host $host; # 添加X-Real-IP头记录客户端的真实IP proxy_set_header X-Real-IP $remote_addr; # 更新X-Forwarded-For头以追加当前跳转的客户端IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 如果有其他自定义需求,也可以在此处扩展更多header } } ``` 上述配置中: - `$host`: 动态获取客户端请求的目标域名,并将其传递至后端服务器[^3]。 - `$remote_addr`: 获取直接与 Nginx 连接的客户端 IP 地址[^2]。 - `$proxy_add_x_forwarded_for`: 自动将现有 `X-Forwarded-For` 字段的内容附加到新加入的客户端 IP 上,适用于多级代理环境下的情况。 #### 3. 特殊场景考虑 如果存在多层次的 Nginx 或负载均衡器,则需要注意以下事项: - 当前层应始终使用 `$proxy_add_x_forwarded_for` 来更新而非简单替换 `X-Forwarded-For`,以免丢失上游已有的数据链条[^4]。 例如,在外层内层分别做如下调整即可满足复杂架构的需求: ```nginx # 外层 location /testApi1 { proxy_pass http://kwtest1; proxy_set_header X-Forwarded-For $remote_addr; } # 内层 location /testApi2 { proxy_pass http://kwtest2; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } ``` 这样能够确保每一步都准确无误地保存了完整的访问路径信息。 #### 4. Web 应用层面读取用户 IP 方法 最终到达目标应用程序时,可以通过检查这些特定 Header 来识别用户的实际来源地址。大多数现代框架均支持便捷方法提取此类元数据;比如 PHP 中可通过 $_SERVER['HTTP_X_FORWARDED_FOR'] 或者 $_SERVER['REMOTE_ADDR'] 实现相应逻辑判断。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值