PHP getenv HTTP_X_转发_以包含字母表

PHP getenv HTTP_X_转发_以包含字母表,php,ip,Php,Ip,嗨,我是ip新手,不知道如何获得真正的ip地址 我不知道为什么http\u x\u转发return2ip 为什么第一个包含字母表的http\u x\u 为什么http\u client\u ip、http\u x\u forwarded、http\u forwarded、http\u forwarded为空 为什么remote\u addr不同于http\u x\u forwarded\u for 哪一个是正确的ip地址如果您处理的是代理,那么每当您转发请求时,这些代理可能会添加X-Forwar

嗨,我是ip新手,不知道如何获得真正的ip地址

  • 我不知道为什么http\u x\u转发return2ip

  • 为什么第一个包含字母表的
    http\u x\u

  • 为什么
    http\u client\u ip、http\u x\u forwarded、http\u forwarded、http\u forwarded
    为空

  • 为什么
    remote\u addr
    不同于
    http\u x\u forwarded\u for


  • 哪一个是正确的ip地址

    如果您处理的是代理,那么每当您转发请求时,这些代理可能会添加X-Forwarded-For头。例如:

    $ipaddress = '';
            if ( getenv('HTTP_CLIENT_IP') ) {
                $ipaddress = getenv('HTTP_CLIENT_IP');
            } else if( getenv('HTTP_X_FORWARDED_FOR') ) {
                $ipaddress = getenv('HTTP_X_FORWARDED_FOR');
                $ipaddress = explode(",", $ipaddress);
                $ipaddress = $ipaddress[0];
            } else if( getenv('HTTP_X_FORWARDED') ) {
                $ipaddress = getenv('HTTP_X_FORWARDED');
            } else if( getenv('HTTP_FORWARDED_FOR') ) {
                $ipaddress = getenv('HTTP_FORWARDED_FOR');
            } else if( getenv('HTTP_FORWARDED') ) {
                $ipaddress = getenv('HTTP_FORWARDED');
            } else if( getenv('REMOTE_ADDR') ) {
                $ipaddress = getenv('REMOTE_ADDR');
            } else {
                $ipaddress = 'UNKNOWN';
            }
            return ip2long($ipaddress);
    
    
    http_client_ip - null
    http_x_forwarded_for - 2604:2000:6147:df00:25ee:04a4:ea44:6947, 162.158.62.236
    http_x_forwarded - null
    http_forwarded_for - null
    http_forwarded - null
    remote_addr 112.121.183.210
    
    这里涉及两个代理,一个在客户端,一个在服务器的数据中心,或者两者都在客户端,或者两者都在数据中心,或者您遇到的任何其他组合

    然后,服务器(PHP)将远程IP视为最接近的代理。这就是它获得“物理”连接的地方

    为了方便起见,两个代理都将从中获取请求的地址添加到HTTP头中。“字母”地址是一个字母


    如果您知道是谁设置了这些标题,则应该只信任其中任何一个标题。唯一保证的经验证地址是
    远程地址
    ,因为这是实际连接。其他的只是HTTP头,任何人都可以设置,包括客户端本身。除非您知道您的数据中心有一个代理,并且您知道它确切设置了什么标题,否则您应该忽略它们。

    我的服务器顺便使用了cdn,然后它就是cdn的代理。因此,我应该只使用remote_addr?这将始终是cdn的代理,这不是很有用。调查您的CDN设置的确切标头,并验证您是否可以依赖它;然后你也可以使用这些信息。我尝试远程添加&它们是不同的,其中一个显示HTTP\u X\u转发
    client -> proxy -> proxy -> server