2011-04-27 86 views

回答

139

喜歡本作的服務器IP:

$_SERVER['SERVER_ADDR']; 

,這爲港口

$_SERVER['SERVER_PORT']; 
+8

否。在某些共享主機上返回:: 1 – TheRealChx101 2014-08-02 06:18:00

+1

這可能不正確,這取決於Web服務器前面使用的負載平衡器。在這種情況下,您還需要X-Forwarded-For標頭:http://en.wikipedia.org/wiki/X-Forwarded-For – Ligemer 2014-08-25 23:04:17

+17

這不是服務器地址!這是* remote *瀏覽器調用遠程用戶控制的服務器的地址。使用由'約翰K'的答案而不是 – Ariel 2015-02-12 10:36:26

19

例如:

$_SERVER['SERVER_ADDR'] 

當你在IIS上,嘗試:

$_SERVER['LOCAL_ADDR'] 
+1

當PHP作爲CGI模塊運行時,$ _SERVER ['LOCAL_ADDR']'僅在IIS下可用。 – 2011-04-27 07:58:07

+0

@rudi_visser它也適用於fastcgi,但是如果通過locahost連接,則返回:: 1返回。如果通過服務器的名稱或IP連接,則會返回真實的IP。 – starbeamrainbowlabs 2012-07-21 14:01:49

+0

@starbeamrainbowlabs FastCGI *是* CGI :)我的意思是與作爲ISAPI模塊運行形成鮮明對比,這是在FastCGI作爲穩定平臺出現之前編寫的。 – 2012-07-21 17:54:49

5

檢查$_SERVER陣列

echo $_SERVER['SERVER_ADDR']; 
-1

像這樣:

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

以前的答案都給予$ _ SERVER [ 'SERVER_ADDR']。這在一些IIS安裝上不起作用。如果你想這在IIS上工作,那麼使用以下命令:

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

您可能需要使用$HTTP_SERVER_VARS['server_ADDR'],如果你沒有得到上面的答案什麼,如果你正在使用PHP

的舊版本
1

我發現這對我有用: GetHostByName(「」);

在運行Apache webserver的Windows 7上運行XAMPP v1.7.1。 不幸的是,它只是給我的網關IP地址。

-1

檢查$ _ SERVER數組

echo $_SERVER['SERVER_ADDR']; 
+1

這並沒有找到「真正的IP」,它發現任何人可能設置的***任意,未經驗證的HTTP頭,任何人都可能用它來欺騙他們的IP,如果你喜歡他們。如果客戶端位於代理服務器後面,那麼不要相信任何HTTP頭文件。這也不符合這個問題。 – deceze 2013-04-03 10:15:04

+1

無法確定這個答案如何不符合問題。問題是:「我如何識別PHP中的服務器IP地址?」。 OP應該學會如何更好地提問,或者你應該學習如何閱讀問題。此外,如果客戶端位於代理服務器後面,無論您嘗試從服務器端進行嘗試,仍然會受到干擾。完全不同的情況是服務器位於代理之後,因爲您可以使用X-FORWARDED-FOR標頭進行檢查。 – 2014-05-20 15:14:20

2

我剛剛創建一個簡單的腳本,將帶回$ _ SERVER [「REMOTE_ADDR」]和$ _ SERVER [「SERVER_ADDR」]在IIS,所以你不必改變每個變量。只需將此文本粘貼到每個頁面中包含的php文件中即可。

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

如果您使用的PHP版本5.3或更高版本,你可以做到以下幾點:

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

這種運作良好,當你正在運行一個獨立的腳本,通過Web服務器沒有運行。

+5

這是一個好主意,但性能可能是gethostbyname()的問題... – andreas 2013-07-04 13:33:06

+0

完美,我在找什麼。謝謝John – Frank 2014-01-07 13:28:08

+4

+1這是唯一可以與命令行配合使用的解決方案。 – 2014-11-09 01:52:52

4

如果使用在bash PHP殼,您可以使用:

$server_name=exec('hostname'); 

因爲$_SERVER[] SERVER_ADDRHTTP_HOSTSERVER_NAME未設置。

10

最新的投票答案都不會可靠地返回服務器的公共地址。通常$_SERVER['SERVER_ADDR']將是正確的,但是如果您通過VPN訪問服務器,它可能會返回內部網絡地址而不是公共地址,即使不在同一網絡上,某些配置將只會是空白或其他一些配置指定值。

同樣,有些情況下$host= gethostname(); $ip = gethostbyname($host);不會返回正確的值,因爲它依靠DNS(內部配置的或外部記錄)和服務器的主機名設置來推斷服務器的IP地址。這兩個步驟都可能有問題。例如,如果服務器的主機名被格式化爲域名(即HOSTNAME=yahoo.com),那麼(至少在我的php5.4/Centos6設置中)gethostbyname將跳過直接找到Yahoo.com的地址而不是本地服務器的地址。

此外,由於gethostbyname倒在公共DNS記錄了測試服務器,與未公開的或不正確的公共DNS記錄(例如,你被localhost或IP地址訪問服務器,或者如果你正在使用覆蓋公共DNS您當地的hosts文件),那麼你將得到沒有IP地址(它只會返回主機名),或者更糟糕的是,它會返回公共DNS記錄中指定的錯誤地址(如果存在的話)或域名是否有通配符。

根據不同的情況,你也可以通過做這樣的嘗試第三種方法:

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

這有其自身的缺陷(依賴於特定的第三方網站,並有可能是網絡設置該路由通過不同的主機或代理路由出站連接)並且像gethostbyname那樣可能會很慢。我真的不確定哪種方法最經常是正確的,但要記住的一點是,特定的場景/配置會導致所有這些方法的錯誤輸出......因此,如果可能的話,請驗證您的方法使用正在返回您期望的值。

2

我來到這個頁面尋找一種讓我自己的IP地址不是連接到我的遠程機器的方式。

這不適用於Windows機器。

但如果有人搜索我一直在尋找:

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

(從How to I get the primary IP address of the local machine on Linux and OS X?無恥改編)

+0

這是從shell運行PHP腳本時實際工作的唯一選項。問題:當有多個活動接口時,如何決定返回哪個地址?我測試了有線和無線以太網連接處於活動狀態,然後僅使用無線活動,並且兩次都返回wlan ip。好劇本,謝謝! – 2017-05-20 18:18:37

+0

它實際上並不知道要返回哪一個。它只是從ifconfig的輸出中返回最後一個inet接口,但忽略127.0.0.1。如果你只有「常用」接口,那麼它的表現相當不錯。如果你指定你想要的接口「ifconfig wlan0 | ...」,這可能是最安全的。這個腳本絕不是完美的,但它可以在簡單的設置中工作,它演示瞭如何在原則上做到這一點,以便根據需要進行調整。 – Dominic 2017-05-24 07:36:34

+0

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 \。 )'是我對此的最新修訂。它過濾掉所有本地ips,只給你外部 – Dominic 2017-11-14 13:20:46

3

這是你可以爲上面的例子適應用什麼,而不必擔心捲曲安裝在你的服務器上。

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