PHP'de sunucu IP adresi nasıl belirlenir


122

PHP'de sunucu IP adresini nasıl belirleyebilirim?


2
Uygulamanızı çalıştıran makinenin IP adresini mi yoksa IP adresini mi kastediyorsunuz?
wosis

Yanıtlar:


175

Bunun gibi sunucu ip'si için:

$_SERVER['SERVER_ADDR'];

ve bu liman için

$_SERVER['SERVER_PORT'];

10
Hayır. Bazı paylaşılan ana bilgisayarlarda bu şu döndürür: 1
TheRealChx101

3
Web sunucunuzun önünde kullanılan Yük Dengeleyiciye bağlı olarak bu yanlış olabilir. X-Forwarded-For başlığını bu senaryoda da
istiyorsunuz

31
Bu sunucu adresi DEĞİLDİR! Bu, uzak tarayıcının sunucuya çağırdığı ve uzak kullanıcının kontrolü altında olan adrestir . Cevabı John Kbunun yerine kullanın
Ariel

Bu, sunucuya ip vermez. Bazı nedenlerden dolayı yerel ipimi veriyor
Thomas Williams

Ayrıca php-fpm sunucu adresini vermez, ancak ilişkili web sunucusu içindir (nginx, apache). Bu nedenle mysql-client host spesifikasyonu (user @ host) için doğru olmayacaktır.
scipilot

105

PHP 5.3 veya üstünü kullanıyorsanız, aşağıdakileri yapabilirsiniz:

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

Bu, web sunucusu üzerinden değil, bağımsız bir komut dosyası çalıştırdığınızda iyi çalışır.


Mükemmel, aradığım şey. Teşekkürler John
Frank

6
+1 Bu, komut satırı ile çalışacak tek çözümdür.
Adam Elsodaney

2
@andreas olmamalı. Yerel ana bilgisayar adı /etc/hostsdosyada olmalı ve hızlı olacaktır - öyle olsa da 127.0.0.1. DNS'i çağırması gerekiyorsa, o zaman söylediğiniz gibi yavaş olacaktır.
Ariel

+1 ama sadece bir soru .. Yerel bir sunucuda xampp ile deniyorum ve ip 192.168etc ile dönüyor ama .. 127.0.0.1 hayır olmalı?
Andrea Bori

bu benim için çalışıyor ancak bazı makine alan adını gösteriyor. bu sorunun nasıl düzeltileceği.
Dharani Dharan

19

Örneğin:

$_SERVER['SERVER_ADDR']

IIS'de olduğunuzda şunu deneyin:

$_SERVER['LOCAL_ADDR']

2
$_SERVER['LOCAL_ADDR']IIS altında yalnızca PHP bir CGI modülü olarak çalışırken kullanılabilir.
Rudi Visser

@rudi_visser fastcgi ile de çalışır, ancak locahost ile bağlanırsanız, bunun yerine :: 1 geri alırsınız. Sunucu adı veya ip ile bağlanırsanız, gerçek ipi geri alırsınız.
starbeamrainbowlabs

@starbeamrainbowlabs FastCGI , CGI'dır :) Bir ISAPI modülü olarak çalışmanın aksine, bu FastCGI'nin kararlı bir platform olarak gelişmesinden önce yazılmıştı.
Rudi Visser

@starbeamrainbowlabs şuna benzeyen her şey :: 1 muhtemelen bir IP6 adresidir
Toby Allen

@TobyAllen Teşekkür ederim :). Garip olan şey, ağımın ipv6'yı desteklememesi, ancak sunucumun (Windows 7 makinesi) IP'sini :: 1, ipv6 geri döngü adresi olarak bildirmesidir.
starbeamrainbowlabs

13

Bu sayfaya, bana bağlanan uzak makineden değil, kendi ip adresimi almanın bir yolunu bulmak için geldim.

Bu bir Windows makinesinde çalışmayacaktır.

Ama birisinin aradığımı araması durumunda:

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

(Utanmadan uyarlanmıştır Linux ve OS X üzerinde yerel makinenin birincil IP adresini almak nasıl? )


Bu, PHP betiklerini kabuktan çalıştırırken gerçekten çalışan tek seçenektir. Soru: Birden çok aktif arayüz olduğunda, bu hangi adresin döneceğine nasıl karar verir? Kablolu ve kablosuz ethernet bağlantılarını aktif olarak test ettim ve sonra sadece kablosuz aktif olarak test ettim ve wlan ip'i her iki kez de döndürüyor. İyi senaryo, teşekkürler!
Ryan Griggs

Aslında hangisinin döneceğini bilmiyor. Basitçe ifconfig çıktısından son inet arayüzünü döndürür, ancak 127.0.0.1'i yok sayar. Yalnızca "normal" arayüzlere sahipseniz, oldukça iyi bir iş çıkarır. İstediğiniz arayüzü "ifconfig wlan0 | ..." belirlerseniz muhtemelen en güvenli yoldur. Bu komut dosyası kesinlikle mükemmel değildir, ancak basit ayarlarda çalışır ve prensipte bunun nasıl yapılacağını, gerektiğinde ayarlanacağını gösterir.
Dom

1
ifconfig | grep 'inet adres' | cut -d ':' -f 2 | awk '{print $ 1}' | grep -vE '^ (192 \ .168 | 10 \. | 172 \ .1 [6789] \. | 172 \ .2 [0-9] \. | 172 \ .3 [01] \. | 127 \. ) 'bunun son revizyonudur. Tüm yerel IP'leri filtreler ve yalnızca size harici verileri verir
Dom

Birden çok ağ arabirimim var, bu yüzden yaptımifconfig | 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

En çok oylanan yanıtların hiçbiri, sunucunun genel adresini güvenilir bir şekilde döndürmez. genellikle$_SERVER['SERVER_ADDR'] olarak doğru olacaktır, ancak sunucuya bir VPN üzerinden erişiyorsanız, genel bir adres yerine dahili ağ adresini döndürecek ve aynı ağda olmasa bile bazı yapılandırmalar yalnızca boş olacak veya başka bazılarını belirtecektir. değer.

Aynı şekilde, $host= gethostname(); $ip = gethostbyname($host);sunucunun IP adresini tahmin etmek için hem DNS'ye (dahili olarak yapılandırılmış veya harici kayıtlar) hem de sunucunun ana bilgisayar adı ayarlarına dayandığı için doğru değerleri döndürmeyecek senaryolar vardır . Bu adımların her ikisi de potansiyel olarak hatalı. Örneğin, sunucunun ana bilgisayar adı bir alan adı (yani HOSTNAME=yahoo.com) gibi biçimlendirilmişse (en azından benim php5.4 / Centos6 kurulumumda) gethostbynameyerel sunucunun yerine doğrudan Yahoo.com'un adresini bulmaya atlayacaktır.

Ayrıca, gethostbynamegenel DNS kayıtlarına geri döndüğünden, yayınlanmamış veya yanlış genel DNS kayıtlarına sahip bir test sunucusu (örneğin, sunucuya localhostveya IP adresinden erişiyorsunuz veya yerel hostsdosyanızı kullanarak genel DNS'yi geçersiz kılıyorsanız ), o zaman siz ' Ya hiç IP adresini geri almayacağım (sadece ana bilgisayar adını döndürecektir) ya da daha da kötüsü, varsa ya da etki alanı için bir joker karakter varsa, genel DNS kayıtlarında belirtilen yanlış adresi döndürecektir.

Duruma bağlı olarak, aşağıdaki gibi bir şey yaparak üçüncü bir yaklaşımı da deneyebilirsiniz:

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

Bunun kendi kusurları vardır (belirli bir üçüncü taraf sitesine dayanır ve giden bağlantıları farklı bir ana bilgisayar veya proxy aracılığıyla yönlendiren ağ ayarları olabilir) ve gethostbynamebunun gibi yavaş olabilir. Dürüst olmak gerekirse, hangi yaklaşımın çoğu zaman doğru olacağından emin değilim, ancak esas alınacak ders, belirli senaryoların / konfigürasyonların tüm bu yaklaşımlar için yanlış çıktılara neden olacağıdır ... kullanmak beklediğiniz değerleri döndürmektir.


10

Bu, sunucunuzda kurulu curl hakkında endişelenmeden yukarıdaki örneklerin bir uyarlaması olarak kullanabileceğiniz şeydir.

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

PHP'yi bash kabuğunda kullanıyorsanız şunları kullanabilirsiniz:

$server_name=exec('hostname');

Çünkü $_SERVER[] SERVER_ADDR, HTTP_HOSTve SERVER_NAMEayarlanmaz.


4

Önceki cevapların tümü $ _SERVER ['SERVER_ADDR'] verir. Bu, bazı IIS kurulumlarında çalışmayacaktır. Bunun IIS üzerinde çalışmasını istiyorsanız, aşağıdakileri kullanın:

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

2

Bunu benim için çalıştığını buldum: GetHostByName ("");

Apache web sunucusu çalıştıran Windows 7'de XAMPP v1.7.1 çalıştırılıyor. Ne yazık ki sadece ağ geçidi IP adresimi veriyor.


2

IIS'de $ _SERVER ['REMOTE_ADDR'] ve $ _SERVER ['SERVER_ADDR'] değerlerini geri getirecek basit bir betik oluşturdum, böylece her değişkeni değiştirmeniz gerekmez. Bu metni her sayfada bulunan php dosyanıza yapıştırmanız yeterlidir.

/** 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

$HTTP_SERVER_VARS['server_ADDR']Yukarıdaki cevaplardan hiçbir şey alamıyorsanız ve PHP'nin eski sürümünü kullanıyorsanız kullanmanız gerekebilir .


0

$ _SERVER dizisini kontrol edin

echo $_SERVER['SERVER_ADDR'];

1
Bu, "gerçek IP" yi bulamaz, herhangi birinin ayarlayabileceği keyfi, doğrulanmamış HTTP başlıklarını bulur ve isterseniz herhangi biri IP'lerini taklit etmek için kullanabilir. İstemci bir proxy'nin arkasındaysa, öyle olsun, herhangi bir HTTP başlığına güvenmeyin. Bu da soruya hiç uymuyor.
ezik

2
Bu cevabın soruya nasıl uymadığını anlayamıyorum. Soru şuydu: "PHP'de sunucu IP adresini nasıl belirleyebilirim?". OP ya nasıl daha iyi sorulacağını öğrenmeli ya da bir soruyu nasıl okuyacağınızı öğrenmelisiniz. Ayrıca, istemci bir proxy'nin arkasındaysa, sunucu tarafından ne denerseniz deneyin yine de mahvolursunuz. Tamamen farklı bir senaryo, sunucunun bir proxy arkasında olduğu durumdur, çünkü X-FORWARDED-FOR başlıklarını kontrol edebilirsiniz.
Luis Masuelli

@deceze'nin $_SERVER["SERVER_ADDR"]HTTP başlıkları ile ilgisi yoktur. Bu, sunucu yazılımı tarafından doldurulur, $ _SERVER içindeki tüm HTTP ile ilgili şeyler HTTP_ ile başlar. php.net/manual/en/reserved.variables.server.php
poncha

@poncha Yorumum bu yazının orijinal revizyonuyla ilgiliydi .
deceze

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.