Como identificar o endereço IP do servidor em PHP

122

Como posso identificar o endereço IP do servidor em PHP?

Pooja
fonte
2
você quer dizer o endereço IP de solicitação ou o IP da máquina executando seu aplicativo?
wosis

Respostas:

175

Assim para o ip do servidor:

$_SERVER['SERVER_ADDR'];

e isso para o porto

$_SERVER['SERVER_PORT'];
CloudyMarble
fonte
9
Não. Em alguns hosts compartilhados, isso retorna :: 1
TheRealChx101
3
Isso pode estar incorreto dependendo do Load Balancer que está sendo usado na frente de seu servidor da web. Você deseja o cabeçalho X-Forwarded-For também neste cenário: en.wikipedia.org/wiki/X-Forwarded-For
Ligemer
31
Este NÃO é o endereço do servidor! Este é o endereço que o navegador remoto chama o servidor, que está sob controle do usuário remoto. Em John Kvez disso, use a resposta por
Ariel
Isso não dá o ip do servidor. Por alguma razão, estou fornecendo meu ip local
Thomas Williams
Ele também não fornece o endereço do servidor php-fpm, mas é para o servidor web associado (nginx, apache). Portanto, não será correto para a especificação de host do cliente mysql (usuário @ host).
scipilot
105

Se estiver usando o PHP versão 5.3 ou superior, você pode fazer o seguinte:

$host= gethostname();
$ip = gethostbyname($host);

Isso funciona bem quando você está executando um script autônomo, não por meio do servidor da web.

John K
fonte
Perfeito, o que procuro. Obrigado John
Frank
6
+1 Esta é a única solução que funcionará com a linha de comando.
Adam Elsodaney
2
@andreas Não deveria. O nome do host local deve estar no /etc/hostsarquivo e será rápido - embora possa apenas ser 127.0.0.1. Se for necessário chamar DNS, será lento como você disse.
Ariel
1 mas só uma pergunta .. eu tento com xampp em um servidor local e ele retorna o ip 192.168etc mas .. deve ser 127.0.0.1 não ??
Andrea Bori,
isso funciona para mim, mas algumas máquinas estão mostrando o nome de domínio. como retificar este problema.
Dharani Dharan
19

por exemplo:

$_SERVER['SERVER_ADDR']

quando estiver no IIS, tente:

$_SERVER['LOCAL_ADDR']
Frasco
fonte
2
$_SERVER['LOCAL_ADDR']só está disponível no IIS quando o PHP está sendo executado como um módulo CGI.
Rudi Visser
@rudi_visser funciona com fastcgi também, mas se você se conectar via locahost, receberá :: 1 de volta. Se você se conectar por meio do nome ou ip do servidor, receberá o ip real de volta.
starbeamrainbowlabs
@starbeamrainbowlabs FastCGI é CGI :) Eu quis dizer, em contraste com a execução como um módulo ISAPI, isso foi escrito antes do grande advento do FastCGI como uma plataforma estável.
Rudi Visser
@starbeamrainbowlabs qualquer coisa que se pareça com :: 1 é provavelmente um endereço IP6
Toby Allen
@TobyAllen Obrigado :). O estranho é que minha rede não suporta ipv6, mas meu servidor (máquina Windows 7) reporta seu IP como :: 1, o endereço de loopback ipv6.
starbeamrainbowlabs
13

Eu vim para esta página procurando uma maneira de obter meu próprio endereço IP, não o da máquina remota conectada a mim.

Isso não funcionará para uma máquina Windows.

Mas caso alguém procure o que procuro:

#! /usr/bin/php
<?php
$my_current_ip=exec("ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'");
echo $my_current_ip;

(Desavergonhadamente adaptado de Como obter o endereço IP principal da máquina local no Linux e OS X? )

Dom
fonte
Esta é a única opção que realmente funciona ao executar scripts PHP a partir do shell. Pergunta: quando há várias interfaces ativas, como isso decide qual endereço retornar? Eu testei com conexões ethernet wlan e wireless ativas, e depois apenas com wireless ativo, e ele retorna o ip wlan nas duas vezes. Bom roteiro, obrigado!
Ryan Griggs
Na verdade, ele não sabe qual devolver. Ele simplesmente retorna a última interface inet da saída de ifconfig, mas ignorando 127.0.0.1. Se você tem apenas as interfaces "normais", ele faz um bom trabalho. Provavelmente é mais seguro especificar a interface desejada "ifconfig wlan0 | ...". Este script não é de forma alguma perfeito, mas funciona em ambientes simples e demonstra como fazer isso em princípio, para ser ajustado conforme necessário.
Dom
1
ifconfig | grep 'inet addr' | cut -d ':' -f 2 | awk '{print $ 1}' | grep -vE '^ (192 \ .168 | 10 \. | 172 \ .1 [6789] \. | 172 \ .2 [0-9] \. | 172 \ .3 [01] \. | 127 \. ) 'é minha última revisão disso. Ele filtra todos os ips locais e fornece apenas itens externos
Dom
Tenho várias interfaces de redeifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1' | grep -e '192\.168\.1\.'
Jonathan
10

Nenhuma das respostas mais votadas retornará de forma confiável o endereço público do servidor. Geralmente $_SERVER['SERVER_ADDR']estará correto, mas se você estiver acessando o servidor através de uma VPN, ele provavelmente retornará o endereço da rede interna em vez de um endereço público e, mesmo quando não estiverem na mesma rede, algumas configurações estarão simplesmente em branco ou terão algum outro especificado valor.

Da mesma forma, existem cenários em $host= gethostname(); $ip = gethostbyname($host);que não retornará os valores corretos porque está contando com o DNS (configurado internamente ou registros externos) e as configurações de nome de host do servidor para extrapolar o endereço IP do servidor. Ambas as etapas são potencialmente falhas. Por exemplo, se o nome do host do servidor estiver formatado como um nome de domínio (ou seja HOSTNAME=yahoo.com, pelo menos na minha configuração php5.4 / Centos6) gethostbynameirá pular direto para encontrar o endereço do Yahoo.com ao invés do servidor local.

Além disso, como gethostbynamerecorre a registros DNS públicos, um servidor de teste com registros DNS públicos não publicados ou incorretos (por exemplo, você está acessando o servidor por meio de localhostum endereço IP ou se estiver substituindo o DNS público usando seu hostsarquivo local ), então você ' Não receberei nenhum endereço IP (apenas retornará o nome do host) ou, pior ainda, retornará o endereço errado especificado nos registros DNS públicos, se houver um ou se houver um caractere curinga para o domínio.

Dependendo da situação, você também pode tentar uma terceira abordagem fazendo algo assim:

$external_ip = exec('curl http://ipecho.net/plain; echo');

Isso tem suas próprias falhas (depende de um site de terceiros específico e pode haver configurações de rede que roteiam conexões de saída por meio de um host ou proxy diferente) e gethostbynamepode ser lento. Sinceramente, não tenho certeza de qual abordagem será a correta com mais frequência, mas a lição a ser levada a sério é que cenários / configurações específicos resultarão em saídas incorretas para todas essas abordagens ... portanto, se possível, verifique se a abordagem que você está using está retornando os valores que você espera.

Dobrar
fonte
9

Isso é o que você pode usar como uma adaptação dos exemplos acima sem se preocupar com o curl instalado em seu servidor.

<?php
      // create a new cURL resource
      $ch = curl_init ();

      // set URL and other appropriate options
      curl_setopt ($ch, CURLOPT_URL, "http://ipecho.net/plain");
      curl_setopt ($ch, CURLOPT_HEADER, 0);
      curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);

      // grab URL and pass it to the browser

      $ip = curl_exec ($ch);
      echo "The public ip for this server is: $ip";
      // close cURL resource, and free up system resources
      curl_close ($ch);
    ?>
Emmanuel Mahuni
fonte
5

Verifique a matriz $ _SERVER

echo $_SERVER['SERVER_ADDR'];
Ale
fonte
5

Se você estiver usando PHP no shell bash, poderá usar:

$server_name=exec('hostname');

Porque $_SERVER[] SERVER_ADDR, HTTP_HOSTe SERVER_NAMEnão estão definidos.

Stefano Zanola
fonte
4

Todas as respostas anteriores fornecem $ _SERVER ['SERVER_ADDR']. Isso não funcionará em algumas instalações do IIS. Se você quiser que isso funcione no IIS, use o seguinte:

$server_ip = gethostbyname($_SERVER['SERVER_NAME']);
qbert220
fonte
2

Descobri que isso funcionou para mim: GetHostByName ("");

Executando o XAMPP v1.7.1 no Windows 7 executando o servidor da web Apache. Infelizmente, apenas forneceu o endereço IP do meu gateway.

Sanford Staab
fonte
2

Acabei de criar um script simples que trará de volta $ _SERVER ['REMOTE_ADDR'] e $ _SERVER ['SERVER_ADDR'] no IIS para que você não precise alterar todas as variáveis. Basta colar esse texto em seu arquivo php que está incluído em todas as páginas.

/** IIS IP Check **/
if(!$_SERVER['SERVER_ADDR']){ $_SERVER['SERVER_ADDR'] = $_SERVER['LOCAL_ADDR']; }
if(!$_SERVER['REMOTE_ADDR']){ $_SERVER['REMOTE_ADDR'] = $_SERVER['LOCAL_ADDR']; }
Xander
fonte
1
$serverIP = $_SERVER["SERVER_ADDR"];
echo "Server IP is: <b>{$serverIP}</b>";
Machado
fonte
1

Você pode ter que usar $HTTP_SERVER_VARS['server_ADDR']se não obtiver nada das respostas acima e se estiver usando uma versão anterior do PHP

OpenCode
fonte
0

Verifique a matriz $ _SERVER

echo $_SERVER['SERVER_ADDR'];
Gaurang
fonte
1
Isso não encontra o "IP real", ele encontra cabeçalhos HTTP arbitrários e não verificados que qualquer um pode definir e qualquer um pode usar para falsificar seu IP se você preferir. Se o cliente estiver atrás de um proxy, então que seja, não confie em nenhum cabeçalho HTTP. Isso também não se enquadra na questão.
deceze
2
Não consigo imaginar como essa resposta não se encaixa na pergunta. A pergunta era: "Como posso identificar o endereço IP do servidor em PHP?". O OP deve aprender a perguntar melhor ou você deve aprender a ler uma pergunta. Além disso, se o cliente estiver atrás de um proxy, você ainda estará ferrado, não importa o que tente do lado do servidor. Um cenário totalmente diferente é quando o servidor está atrás de um proxy, já que você pode verificar com os cabeçalhos X-FORWARDED-FOR.
Luis Masuelli de
@deceze $_SERVER["SERVER_ADDR"]não tem nada a ver com cabeçalhos HTTP. Isso é preenchido pelo software do servidor, todas as coisas relacionadas a HTTP em $ _SERVER são prefixadas com HTTP_. php.net/manual/en/reserved.variables.server.php
poncha
@poncha Meu comentário pertence à revisão original desta postagem.
deceze
-1

Como isso:

$_SERVER['SERVER_ADDR'];
Shadow Wizard é ouvido para você
fonte