从客户端 Apache 和 Php 获取 IP

Posted

技术标签:

【中文标题】从客户端 Apache 和 Php 获取 IP【英文标题】:Get Ip From Client Apache and Php 【发布时间】:2021-10-19 22:08:17 【问题描述】:

想问,但也许这个问题是重复的。很抱歉,其他问题的所有答案都不适用于我的情况。

问题

我有一个服务器,apache 作为 webserver,默认设置运行 php+7.4,certbot 作为 SSL,公共 IP 为 192.168.1.11,我想检索打开我的网站的客户端的 IP,例如域 news.test .com。 test.com 域本身有一个公共 IP 地址,例如 123.100.1.10。 如何获取打开 news.test.com 域的客户端 IP?

已经做了

我已经这样做以获得IP

public static function get_ip() 
    $mainIp = '';
    if (getenv('HTTP_CLIENT_IP'))
        $mainIp = getenv('HTTP_CLIENT_IP');
    else if(getenv('HTTP_X_FORWARDED_FOR'))
        $mainIp = getenv('HTTP_X_FORWARDED_FOR');
    else if(getenv('HTTP_X_FORWARDED'))
        $mainIp = getenv('HTTP_X_FORWARDED');
    else if(getenv('HTTP_FORWARDED_FOR'))
        $mainIp = getenv('HTTP_FORWARDED_FOR');
    else if(getenv('HTTP_FORWARDED'))
        $mainIp = getenv('HTTP_FORWARDED');
    else if(getenv('REMOTE_ADDR'))
        $mainIp = getenv('REMOTE_ADDR');
    else
        $mainIp = 'UNKNOWN';
    return $mainIp;

问题

我遇到的问题不是我获得的 IP 客户端,而是从 test.com 域获得的 IP。我尝试了另一个互联网连接并进行了公共 IP 测试,但我仍然从 test.com 获得 IP 而不是客户端 IP,是因为我的父域或我的 apache 的设置错误吗?还是有错误或者其他方式获取客户端IP?

【问题讨论】:

getenv() 在这种情况下是错误的。试试这样:***.com/a/64174081/2412335 - 检索客户端的 IP 地址是出了名的不可靠。在您的情况下,我猜有一个反向代理处理入站请求,并且它没有设置所有标头,因此您只会看到该服务器的 IP 地址。另请注意,192.168.1.11 不是公共地址。它可能是您服务器的地址,但 192.168.x.x 块是专门为私有地址保留的。 @TangentiallyPerpendicular yap 我知道不是公共 ip,它只是我的例子。我尝试使用与不同服务器制作的相同应用程序,服务器可以显示与ipinfo.io中相同的ip @digijay 仍然从服务器 awesomescreenshot.com/image/… 获取 ip,我认为,错误不在我的 php 脚本中,而是在我的 apache 网络服务器上的设置 【参考方案1】:

请尝试使用 HTTP_CF_CONNECTING_IP

    public static function get_ip() 
    $mainIp = '';
    if (getenv('HTTP_CF_CONNECTING_IP'))
        $mainIp = getenv('HTTP_CLIENT_IP');
    else if(getenv('HTTP_X_FORWARDED_FOR'))
        $mainIp = getenv('HTTP_X_FORWARDED_FOR');
    else if(getenv('HTTP_X_FORWARDED'))
        $mainIp = getenv('HTTP_X_FORWARDED');
    else if(getenv('HTTP_FORWARDED_FOR'))
        $mainIp = getenv('HTTP_FORWARDED_FOR');
    else if(getenv('HTTP_FORWARDED'))
        $mainIp = getenv('HTTP_FORWARDED');
    else if(getenv('REMOTE_ADDR'))
        $mainIp = getenv('REMOTE_ADDR');
    else
        $mainIp = 'UNKNOWN';
    return $mainIp;

【讨论】:

仍然从服务器 awesomescreenshot.com/image/… 获取 ip,我认为,错误不在我的 php 脚本中,而是在我的 apache 网络服务器上的设置

以上是关于从客户端 Apache 和 Php 获取 IP的主要内容,如果未能解决你的问题,请参考以下文章

php 如何获取服务器的信息

php socket 获取客户端ip地址

php获取客户端真实IP 防止代理和作弊

php怎样获取客户端电脑物理地址

PHP获取客户端和服务器端IP

用php来获得客户端服务器ip的方法