>백엔드 개발 >PHP 튜토리얼 >PHP는 사용자의 실제 IP를 얻습니다

PHP는 사용자의 실제 IP를 얻습니다

WBOY
WBOY원래의
2016-08-08 09:19:535079검색

며칠 전 인터뷰에서 $_SERVER['SERVER_ADDR']을 통해 얻은 IP 주소에 어떤 문제가 있느냐는 질문을 받았습니다. "사용자가 프록시를 통해 실제 IP 주소를 얻을 수 없는 경우"일 것입니다. 다행히 면접관은 더 이상 질문을 하지 않았습니다. 그렇다면 사용자의 실제 IP 주소를 얻는 방법은 무엇입니까?

분석

요즘에는 많은 사용자가 인터넷에 접속하기 위해 직접 전화 접속을 하지 않고 라우터나 다른 프록시를 통해 네트워크에 접속합니다. 사용자 클라이언트의 실제 IP 주소를 얻으려면 $_SERVER['SERVER_ADDR']을 직접 사용할 수는 없습니다. 이렇게 얻은 IP 주소는 사용자의 공인 IP가 아닌 192.168.1.99와 같은 **LAN** IP일 수 있기 때문입니다. 주소 .

다행히도 우리의 접근 요청이 공용 네트워크 라우팅이나 프록시 서버를 통과할 때, 단말은 HTTP 요청에 X-Forwarded-For 헤더 정보를 추가할 것이고, 우리는 이 요청 헤더를 사용하여 해당 요청의 실제 신원을 얻을 수 있습니다. 클라이언트.IP 주소.

코드

<code><span><span><?php</span><span>/**
 * 获取用户的真实ip地址
 *<span> @return</span> string
 */</span><span><span>function</span><span>get_client_ip</span><span>()</span>{</span><span>$headers</span> = <span>array</span>(<span>'HTTP_X_REAL_FORWARDED_FOR'</span>, <span>'HTTP_X_FORWARDED_FOR'</span>, <span>'HTTP_CLIENT_IP'</span>, <span>'REMOTE_ADDR'</span>);
    <span>foreach</span> (<span>$headers</span><span>as</span><span>$h</span>){
        <span>$ip</span> = <span>$_SERVER</span>[<span>$h</span>];
        <span>// 有些ip可能隐匿,即为unknown</span><span>if</span> ( <span>isset</span>(<span>$ip</span>) && strcasecmp(<span>$ip</span>, <span>'unknown'</span>) ){
            <span>break</span>;
        }
    }
    <span>if</span>( <span>$ip</span> ){
        <span>// 可能通过多个代理,其中第一个为真实ip地址</span><span>list</span>(<span>$ip</span>) = explode(<span>', '</span>, <span>$ip</span>, <span>2</span>);
    }
    <span>/* 如果是服务器自身访问,获取服务器的ip地址(该地址可能是局域网ip)
    if ('127.0.0.1' == $ip){
        $ip = $_SERVER['SERVER_ADDR'];
    }
    */</span><span>return</span><span>$ip</span>;
}
<span>?></span></span></code>

저작권: 이 글은 블로거의 원본 글이므로 블로거의 허락 없이 복제할 수 없습니다.

위 내용은 사용자의 실제 IP를 얻기 위한 PHP에 대한 내용을 포함하여, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:ngx_listening_s다음 기사:ngx_listening_s