며칠 전 인터뷰에서 $_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 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.