Yanıtlar:
Bunun gibi sunucu ip'si için:
$_SERVER['SERVER_ADDR'];
ve bu liman için
$_SERVER['SERVER_PORT'];
John K
bunun yerine kullanın
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.
/etc/hosts
dosyada 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.
Örneğin:
$_SERVER['SERVER_ADDR']
IIS'de olduğunuzda şunu deneyin:
$_SERVER['LOCAL_ADDR']
$_SERVER['LOCAL_ADDR']
IIS altında yalnızca PHP bir CGI modülü olarak çalışırken kullanılabilir.
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? )
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\.'
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) gethostbyname
yerel sunucunun yerine doğrudan Yahoo.com'un adresini bulmaya atlayacaktır.
Ayrıca, gethostbyname
genel DNS kayıtlarına geri döndüğünden, yayınlanmamış veya yanlış genel DNS kayıtlarına sahip bir test sunucusu (örneğin, sunucuya localhost
veya IP adresinden erişiyorsunuz veya yerel hosts
dosyanı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 gethostbyname
bunun 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.
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);
?>
PHP'yi bash kabuğunda kullanıyorsanız şunları kullanabilirsiniz:
$server_name=exec('hostname');
Çünkü $_SERVER[] SERVER_ADDR
, HTTP_HOST
ve SERVER_NAME
ayarlanmaz.
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.
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']; }
$ _SERVER dizisini kontrol edin
echo $_SERVER['SERVER_ADDR'];
$_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
Bunun gibi:
$_SERVER['SERVER_ADDR'];