Muitos desenvolvedores utilizam a função para obter o endereço de IP do cliente usando PHP:
SERVER['REMOTE_ADDR'];
$_SERVER é um array contendo informação como cabeçalhos, paths, e localizações do script. As entradas neste array são criadas pelo servidor web. Não há garantia que cada servidor web proverá algum destes.
No entanto, em alguns casos, o endereço de IP obtido não é o real. Recentemente esta função retornava o meu endereço de IP local (192.168.1.130) em vez do meu endereço de IP público que pode ser facilmente obtido pelo www.meuip.com.br. Por outro lado, já na minha residência, retornava o IP corretamente. Como não podemos ter funções que, ora funcionam e, ora não funcionam, resolvi pesquisar e a solução foi a seguinte:
function get_client_ip() {
$ipaddress = '';
if (getenv('HTTP_CLIENT_IP'))
$ipaddress = getenv('HTTP_CLIENT_IP');
else if(getenv('HTTP_X_FORWARDED_FOR'))
$ipaddress = getenv('HTTP_X_FORWARDED_FOR'");
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 $ipaddress;
}
O getenv retorna o nome da variável de ambiente varname, ou FALSE em caso de erro.
ou
function get_client_ip() {
$ipaddress = '';
if ($_SERVER['HTTP_CLIENT_IP'])
$ipaddress = $_SERVER['HTTP_CLIENT_IP'];
else if($_SERVER['HTTP_X_FORWARDED_FOR'])
$ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
else if($_SERVER['HTTP_X_FORWARDED'])
$ipaddress = $_SERVER['HTTP_X_FORWARDED'];
else if($_SERVER['HTTP_FORWARDED_FOR'])
$ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
else if($_SERVER['HTTP_FORWARDED'])
$ipaddress = $_SERVER['HTTP_FORWARDED'];
else if($_SERVER['REMOTE_ADDR'])
$ipaddress = $_SERVER['REMOTE_ADDR'];
else
$ipaddress = 'UNKNOWN';
return $ipaddress;
}
Enfim, funcionalidade de obtenção do real IP do usuário funcionando corretamente em minhas aplicações.
Nota:
Esta função não funciona no modo ISAPI. O Internet Server Application Programming Interface — ISAPI é um protocolo usado por computadores baseados no Windows para rodar uma aplicação dinâmica carregando um módulo externo no espaço de endereçamento do processo do webserver.
Espero que tenha ajudado.
Referências:
http://stackoverflow.com/questions/15699101/get-client-ip-address-using-php
7 Comments
parabéns. aqui funcionou.
Olá!
Não funcionou como esperado…
Veja o que retornou Seu IP é: ::1
O que faço para obter o IP correto
Parabéns pelo artigo.
Cara você não acha que fala de mais não?
Dejair, você acha que devo honrar meu sobrenome? rs
ue e o echo pra ver o ip?
Trata-se de uma função com retorno pra você manipular da forma que quiser.