You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP获取IPv4地址问题:过滤IPv6适配IPv4白名单

解决方案:从转发头中过滤并仅获取IPv4地址

由于你的服务器位于代理之后,HTTP_X_FORWARDED_FOR头可能包含多个用逗号分隔的IP(客户端IP + 各层代理IP),其中可能混杂IPv4和IPv6地址。以下是直接过滤出IPv4的实现方式:

代码实现

function getClientIPv4() {
    // 处理X-Forwarded-For头中的IP列表
    if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        // 拆分逗号分隔的IP,去除每个IP前后的空格
        $ipEntries = array_map('trim', explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']));
        
        foreach ($ipEntries as $ip) {
            // 验证是否为有效的IPv4地址
            if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
                return $ip;
            }
        }
    }

    // 若转发头中无IPv4, fallback到代理服务器的IP(REMOTE_ADDR)
    if (!empty($_SERVER['REMOTE_ADDR']) && filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
        return $_SERVER['REMOTE_ADDR'];
    }

    // 未找到有效IPv4时返回null,可根据业务需求调整(如返回默认值或抛出提示)
    return null;
}

// 使用示例
$client_ip = getClientIPv4();

关键说明

  • 优先取客户端真实IPv4:X-Forwarded-For头的第一个IP通常是客户端真实IP,所以按顺序遍历验证,找到第一个有效IPv4就返回。
  • 代理环境的安全注意:务必确保你的代理服务器(如Nginx、Apache)仅信任合法的代理来源,禁止外部请求伪造X-Forwarded-For头。比如Nginx中可通过set_real_ip_from指定信任的代理IP段,避免IP伪造风险。
  • 无IPv4的处理:如果$client_ip返回null,说明客户端仅使用IPv6访问,此时可直接拦截请求或返回错误提示,避免进入白名单校验环节引发错误。

内容的提问来源于stack exchange,提问作者TheTinniDev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 16:04:53