So identifizieren Sie die Server-IP-Adresse in PHP


122

Wie kann ich die Server-IP-Adresse in PHP identifizieren?


2
Meinen Sie die Anforderungs-IP-Adresse oder die IP des Computers, auf dem Ihre App ausgeführt wird?
Wosis

Antworten:


175

So für die Server-IP:

$_SERVER['SERVER_ADDR'];

und das für den Hafen

$_SERVER['SERVER_PORT'];

9
Nein. Auf einigen gemeinsam genutzten Hosts wird
Folgendes zurückgegeben

3
Dies kann je nach dem vor Ihrem Webserver verwendeten Load Balancer falsch sein. Sie möchten den X-Forwarded-For-Header auch in diesem Szenario: en.wikipedia.org/wiki/X-Forwarded-For
Ligemer

31
Dies ist NICHT die Serveradresse! Dies ist die Adresse, die der Remote- Browser den Server anruft, der vom Remote-Benutzer gesteuert wird. Verwenden Sie John Kstattdessen die Antwort von
Ariel

Dies gibt dem Server keine IP. Aus irgendeinem Grund gibt es meine lokale IP
Thomas Williams

Es gibt auch nicht die PHP-Fpm-Serveradresse an, sondern ist für den zugehörigen Webserver (Nginx, Apache). Daher ist die Hostspezifikation für den MySQL-Client (user @ host) nicht korrekt.
Scipilot

105

Wenn Sie PHP Version 5.3 oder höher verwenden, können Sie Folgendes tun:

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

Dies funktioniert gut, wenn Sie ein eigenständiges Skript ausführen und nicht über den Webserver.


Perfekt, was ich suche. Vielen Dank John
Frank

6
+1 Dies ist die einzige Lösung, die mit der Befehlszeile funktioniert.
Adam Elsodaney

2
@andreas Es sollte nicht. Der lokale Hostname sollte in der /etc/hostsDatei enthalten sein und ist schnell - obwohl dies möglicherweise nur der Fall ist 127.0.0.1. Wenn es DNS anrufen muss, wird es langsam sein, wie Sie sagen.
Ariel

+1 aber nur eine frage .. ich versuche es mit xampp auf einem lokalen server und es gibt die ip 192.168etc zurück aber .. es sollte 127.0.0.1 sein nein ??
Andrea Bori

Dies funktioniert für mich, aber auf einigen Computern wird der Domainname angezeigt. wie man dieses Problem behebt.
Dharani Dharan

19

beispielsweise:

$_SERVER['SERVER_ADDR']

Wenn Sie auf IIS sind, versuchen Sie:

$_SERVER['LOCAL_ADDR']

2
$_SERVER['LOCAL_ADDR']ist nur unter IIS verfügbar, wenn PHP als CGI-Modul ausgeführt wird.
Rudi Visser

@rudi_visser es funktioniert auch mit fastcgi, aber wenn Sie eine Verbindung über locahost herstellen, erhalten Sie stattdessen :: 1 zurück. Wenn Sie eine Verbindung über den Servernamen oder die IP-Adresse herstellen, erhalten Sie die echte IP-Adresse zurück.
Starbeamrainbowlabs

@starbeamrainbowlabs FastCGI ist CGI :) Ich meinte, im Gegensatz zur Ausführung als ISAPI-Modul wurde dies vor dem großen Aufkommen von FastCGI als stabile Plattform geschrieben.
Rudi Visser

@starbeamrainbowlabs alles, was aussieht wie :: 1 ist wahrscheinlich eine IP6-Adresse
Toby Allen

@TobyAllen Danke :). Das Seltsame ist, dass mein Netzwerk IPv6 nicht unterstützt, mein Server (Windows 7-Computer) seine IP jedoch als :: 1, die IPv6-Loopback-Adresse, meldet.
Starbeamrainbowlabs

13

Ich bin auf diese Seite gekommen, um nach einer Möglichkeit zu suchen, meine eigene IP-Adresse zu erhalten, nicht die des Remote-Computers, der eine Verbindung zu mir herstellt.

Dies funktioniert nicht für einen Windows-Computer.

Aber falls jemand nach dem sucht, wonach ich gesucht habe:

#! /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;

(Schamlos angepasst von Wie erhalte ich die primäre IP-Adresse des lokalen Computers unter Linux und OS X? )


Dies ist die einzige Option, die tatsächlich funktioniert, wenn PHP-Skripte über die Shell ausgeführt werden. Frage: Wenn mehrere aktive Schnittstellen vorhanden sind, wie entscheidet dies, welche Adresse zurückgegeben werden soll? Ich habe mit aktiven kabelgebundenen und kabellosen Ethernet-Verbindungen und dann nur mit aktiven kabellosen Verbindungen getestet, und es wird beide Male die WLAN-IP zurückgegeben. Gutes Drehbuch, danke!
Ryan Griggs

Es weiß eigentlich nicht, welches man zurückgeben soll. Es gibt einfach die letzte Inet-Schnittstelle von der Ausgabe von ifconfig zurück, ignoriert jedoch 127.0.0.1. Wenn Sie nur die "üblichen" Schnittstellen haben, dann macht es einen ziemlich guten Job. Es ist wahrscheinlich am sichersten, wenn Sie die gewünschte Schnittstelle "ifconfig wlan0 | ..." angeben. Dieses Skript ist keineswegs perfekt, aber es funktioniert in einfachen Einstellungen und zeigt, wie dies im Prinzip gemacht wird, um nach Bedarf angepasst zu werden.
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 \. ) 'ist meine letzte Überarbeitung davon. Es filtert alle lokalen IPs heraus und gibt Ihnen nur externe
Dom

Ich habe mehrere Netzwerkschnittstellen, also habe ichifconfig | 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

Keine der am besten bewerteten Antworten gibt die öffentliche Adresse des Servers zuverlässig zurück. Im Allgemeinen $_SERVER['SERVER_ADDR']ist dies korrekt, aber wenn Sie über ein VPN auf den Server zugreifen, wird wahrscheinlich die interne Netzwerkadresse anstelle einer öffentlichen Adresse zurückgegeben, und selbst wenn Sie sich nicht im selben Netzwerk befinden, sind einige Konfigurationen einfach leer oder haben eine andere Angabe Wert.

Ebenso gibt es Szenarien, in denen $host= gethostname(); $ip = gethostbyname($host);nicht die richtigen Werte zurückgegeben werden, da sowohl DNS (entweder intern konfigurierte oder externe Einträge) als auch die Hostnameneinstellungen des Servers verwendet werden, um die IP-Adresse des Servers zu extrapolieren. Diese beiden Schritte sind möglicherweise fehlerhaft. Wenn beispielsweise der Hostname des Servers wie ein Domänenname (dh HOSTNAME=yahoo.com) formatiert ist, wird (zumindest in meinem PHP5.4 / Centos6-Setup) gethostbynamedirekt die Adresse von Yahoo.com und nicht die des lokalen Servers gefunden.

Da gethostbynameein Testserver mit unveröffentlichten oder falschen öffentlichen DNS-Einträgen auf öffentliche DNS-Einträge zurückgreift (z. B. localhostwenn Sie über Ihre IP-Adresse auf den Server zugreifen oder wenn Sie öffentlichen DNS mithilfe Ihrer lokalen hostsDatei überschreiben ), müssen Sie Ich erhalte entweder keine IP-Adresse zurück (es wird nur der Hostname zurückgegeben) oder noch schlimmer, es wird die falsche Adresse zurückgegeben, die in den öffentlichen DNS-Einträgen angegeben ist, falls eine vorhanden ist oder wenn ein Platzhalter für die Domäne vorhanden ist.

Abhängig von der Situation können Sie auch einen dritten Ansatz ausprobieren, indem Sie Folgendes tun:

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

Dies hat seine eigenen Mängel (hängt von einer bestimmten Site eines Drittanbieters ab, und es kann Netzwerkeinstellungen geben, die ausgehende Verbindungen über einen anderen Host oder Proxy weiterleiten) und gethostbynamekann langsam sein. Ich bin mir ehrlich gesagt nicht sicher, welcher Ansatz am häufigsten richtig ist, aber die Lektion, die man sich zu Herzen nehmen sollte, ist, dass bestimmte Szenarien / Konfigurationen bei all diesen Ansätzen zu falschen Ergebnissen führen. Überprüfen Sie also nach Möglichkeit, ob Sie der richtige Ansatz sind using gibt die erwarteten Werte zurück.


9

Dies können Sie als Anpassung der obigen Beispiele verwenden, ohne sich Gedanken über die auf Ihrem Server installierte Locke machen zu müssen.

<?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);
    ?>


5

Wenn Sie PHP in der Bash-Shell verwenden, können Sie Folgendes verwenden:

$server_name=exec('hostname');

Denn $_SERVER[] SERVER_ADDR, HTTP_HOSTund SERVER_NAMEsind nicht festgelegt.


4

Die vorherigen Antworten geben alle $ _SERVER ['SERVER_ADDR']. Dies funktioniert bei einigen IIS-Installationen nicht. Wenn dies unter IIS funktionieren soll, verwenden Sie Folgendes:

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

2

Ich fand, dass dies für mich funktioniert: GetHostByName ("");

Ausführen von XAMPP v1.7.1 unter Windows 7 unter Ausführen des Apache-Webservers. Leider gibt es nur meine Gateway-IP-Adresse.


2

Ich habe gerade ein einfaches Skript erstellt, das die $ _SERVER ['REMOTE_ADDR'] und $ _SERVER ['SERVER_ADDR'] in IIS zurückbringt, damit Sie nicht jede Variable ändern müssen. Fügen Sie einfach diesen Text in Ihre PHP-Datei ein, die auf jeder Seite enthalten ist.

/** IIS IP Check **/
if(!$_SERVER['SERVER_ADDR']){ $_SERVER['SERVER_ADDR'] = $_SERVER['LOCAL_ADDR']; }
if(!$_SERVER['REMOTE_ADDR']){ $_SERVER['REMOTE_ADDR'] = $_SERVER['LOCAL_ADDR']; }

1
$serverIP = $_SERVER["SERVER_ADDR"];
echo "Server IP is: <b>{$serverIP}</b>";

1

Sie müssen möglicherweise verwenden, $HTTP_SERVER_VARS['server_ADDR']wenn Sie nichts von den obigen Antworten erhalten und wenn Sie eine ältere Version von PHP verwenden


0

Überprüfen Sie das Array $ _SERVER

echo $_SERVER['SERVER_ADDR'];

1
Das findet nicht die "echte IP", sondern willkürliche, nicht überprüfte HTTP-Header, die jeder setzen kann und die jeder verwenden kann, um seine IP zu fälschen, wenn Sie sie bevorzugen. Wenn sich der Client hinter einem Proxy befindet, vertrauen Sie keinen HTTP-Headern. Dies passt auch überhaupt nicht zur Frage.
Täuschung

2
Ich kann mir nicht vorstellen, wie diese Antwort überhaupt nicht zur Frage passt. Die Frage war: "Wie kann ich die Server-IP-Adresse in PHP identifizieren?". Entweder sollte das OP lernen, besser zu fragen, oder Sie sollten lernen, wie man eine Frage liest. Außerdem, wenn sich der Client hinter einem Proxy befindet, sind Sie immer noch durcheinander, egal was Sie von der Serverseite aus versuchen. Ein völlig anderes Szenario ist, wenn sich der Server hinter einem Proxy befindet, da Sie dies mit X-FORWARDED-FOR-Headern überprüfen können.
Luis Masuelli

@deceze $_SERVER["SERVER_ADDR"]hat nichts mit HTTP-Headern zu tun. Dies wird von der Serversoftware ausgefüllt. Allen HTTP-bezogenen Inhalten in $ _SERVER wird HTTP_ vorangestellt. php.net/manual/en/reserved.variables.server.php
poncha

@poncha Mein Kommentar bezog sich auf die ursprüngliche Überarbeitung dieses Beitrags.
Täuschung

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.