Odpowiedzi:
W ten sposób dla IP serwera:
$_SERVER['SERVER_ADDR'];
i to dla portu
$_SERVER['SERVER_PORT'];
John K
Zamiast tego skorzystaj z odpowiedzi
Jeśli używasz PHP w wersji 5.3 lub nowszej, możesz wykonać następujące czynności:
$host= gethostname();
$ip = gethostbyname($host);
Działa to dobrze, gdy uruchamiasz samodzielny skrypt, a nie przez serwer WWW.
/etc/hosts
pliku i będzie szybka - chociaż może tak być 127.0.0.1
. Jeśli będzie musiał dzwonić do DNS, będzie działać wolno, jak mówisz.
na przykład:
$_SERVER['SERVER_ADDR']
gdy korzystasz z usług IIS, spróbuj:
$_SERVER['LOCAL_ADDR']
$_SERVER['LOCAL_ADDR']
jest dostępny tylko w IIS, gdy PHP działa jako moduł CGI.
Przyszedłem na tę stronę, szukając sposobu na uzyskanie własnego adresu IP, a nie adresu zdalnego komputera, który się ze mną łączy.
To nie zadziała na komputerze z systemem Windows.
Ale na wypadek, gdyby ktoś szukał tego, czego szukałem:
#! /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;
(Bezwstydnie zaadaptowane z How to I get the primary IP address of the local machine on Linux and OS X? )
ifconfig | 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\.'
Żadna z najczęściej wybieranych odpowiedzi nie zwróci niezawodnie adresu publicznego serwera. Ogólnie$_SERVER['SERVER_ADDR']
będzie poprawne, ale jeśli uzyskujesz dostęp do serwera przez VPN, prawdopodobnie zwróci on adres sieci wewnętrznej zamiast adresu publicznego, a nawet jeśli nie jest w tej samej sieci, niektóre konfiguracje będą po prostu puste lub będą miały określone inne wartość.
Podobnie istnieją scenariusze, w których $host= gethostname(); $ip = gethostbyname($host);
nie zwraca prawidłowych wartości, ponieważ opiera się on zarówno na systemie DNS (albo wewnętrznie skonfigurowanym lub zewnętrznych rekordach), jak i ustawieniach nazwy hosta serwera w celu ekstrapolacji adresu IP serwera. Oba te kroki są potencjalnie błędne. Na przykład, jeśli nazwa hosta serwera jest sformatowana jak nazwa domeny (tj. HOSTNAME=yahoo.com
), To (przynajmniej w mojej konfiguracji php5.4 / Centos6) gethostbyname
przejdzie od razu do znalezienia adresu Yahoo.com, a nie lokalnego serwera.
Ponadto, ponieważ gethostbyname
wraca do publicznych rekordów DNS serwera testowego z nieopublikowanymi lub nieprawidłowymi publicznymi rekordami DNS (na przykład uzyskujesz dostęp do serwera za localhost
pomocą adresu IP lub jeśli zastępujesz publiczny DNS przy użyciu lokalnego hosts
pliku), Otrzymam albo brak adresu IP (zwróci tylko nazwę hosta), albo, co gorsza, zwróci zły adres określony w publicznych rekordach DNS, jeśli taki istnieje, lub jeśli istnieje wieloznacznik dla domeny.
W zależności od sytuacji możesz również wypróbować trzecie podejście, wykonując coś takiego:
$external_ip = exec('curl http://ipecho.net/plain; echo');
Ma to swoje wady (zależy od konkretnej witryny innej firmy i mogą istnieć ustawienia sieciowe, które kierują połączenia wychodzące przez inny host lub serwer proxy) i gethostbyname
mogą być powolne. Szczerze mówiąc nie jestem pewien, które podejście będzie najczęściej poprawne, ale lekcja, którą należy wziąć sobie do serca, jest taka, że określone scenariusze / konfiguracje spowodują nieprawidłowe wyniki dla wszystkich tych podejść ... więc jeśli to możliwe, sprawdź, czy podejście jest using zwraca oczekiwane wartości.
To właśnie możesz wykorzystać jako adaptację powyższych przykładów, nie martwiąc się o curl zainstalowaną na serwerze.
<?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);
?>
Jeśli używasz PHP w powłoce bash, możesz użyć:
$server_name=exec('hostname');
Ponieważ $_SERVER[] SERVER_ADDR
, HTTP_HOST
i SERVER_NAME
nie są ustawione.
Okazało się, że działa dla mnie: GetHostByName („”);
Uruchamianie XAMPP w wersji 1.7.1 na Windows 7 z serwerem internetowym Apache. Niestety podaje tylko adres IP mojej bramy.
Właśnie stworzyłem prosty skrypt, który przywróci $ _SERVER ['REMOTE_ADDR'] i $ _SERVER ['SERVER_ADDR'] w IIS, więc nie musisz zmieniać każdej zmiennej. Po prostu wklej ten tekst do pliku php, który jest zawarty na każdej stronie.
/** IIS IP Check **/
if(!$_SERVER['SERVER_ADDR']){ $_SERVER['SERVER_ADDR'] = $_SERVER['LOCAL_ADDR']; }
if(!$_SERVER['REMOTE_ADDR']){ $_SERVER['REMOTE_ADDR'] = $_SERVER['LOCAL_ADDR']; }
Sprawdź tablicę $ _SERVER
echo $_SERVER['SERVER_ADDR'];
$_SERVER["SERVER_ADDR"]
nie ma nic wspólnego z nagłówkami HTTP. Jest to wypełniane przez oprogramowanie serwera, wszystkie rzeczy związane z HTTP w $ _SERVER mają prefiks HTTP_. php.net/manual/en/reserved.variables.server.php
Lubię to:
$_SERVER['SERVER_ADDR'];