1. 程式人生 > 其它 >php 獲取本機外網/公網IP的程式碼

php 獲取本機外網/公網IP的程式碼

  一般都是用 $_SERVER['REMOTE_ADDR'] 獲取使用者IP,

  但如果使用了反向代理的,HTTP頭中 REMOTE_ADDR 就不是使用者的地址,反而是上一級代理的地址了。

  獲取使用者的真實外網IP

function getRealIp() {
  $onlineip = '';
  if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
    $onlineip = getenv('HTTP_CLIENT_IP');
  } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
    $onlineip = getenv('HTTP_X_FORWARDED_FOR');
  } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
    $onlineip = getenv('REMOTE_ADDR');
  } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
    $onlineip = $_SERVER['REMOTE_ADDR'];
  }
  return $onlineip;
}

  趕緊試一下吧 ~

備註:

  getenv(string varname) ,函式定義:獲取系統的環境變數,根據提供不同的引數可以獲取不同的環境變數。

具體引數:
“PHP_SELF”          當前正在執行指令碼的檔名,與document root 相關。如果 PHP 以命令列方式執行,該變數在PHP 4.3.0 之前無效。

“argv”            傳遞給該指令碼的引數。當指令碼執行在命令列方式時,argv 變數傳遞給程式C 語言樣式的命令列引數。當呼叫GET 方法時,該變數包含請求的資料。

“argc”            包含傳遞給程式的命令列引數的個數(如果執行在命令列模式)。

“GATEWAY_INTERFACE”    伺服器使用的CGI 規範的版本。例如,“CGI
/1.1”。 “SERVER_NAME”         當前執行指令碼所在伺服器主機的名稱。如果該指令碼執行在一個虛擬主機上,該名稱是由那個虛擬主機所設定的值決定。 “SERVER_SOFTWARE”       伺服器標識的字串,在響應請求時的頭資訊中給出。 “SERVER_PROTOCOL”       請求頁面時通訊協議的名稱和版本。例如,“HTTP/1.0”。 “REQUEST_METHOD”       訪問頁面時的請求方法。例如:“GET”、“HEAD”,“POST”,“PUT”。                  注: 如果請求的方式是HEAD,PHP 指令碼將在送出頭資訊後中止(這意味著在產生任何輸出後,不再有輸出緩衝)。 “REQUEST_TIME”        請求開始時的時間戳。從PHP
5.1.0 起有效。 “QUERY_STRING”         查詢(query)的字串(URL 中第一個問號? 之後的內容)。 “DOCUMENT_ROOT”        當前執行指令碼所在的文件根目錄。在伺服器配置檔案中定義。 “HTTP_ACCEPT”         當前請求的Accept: 頭資訊的內容。 “HTTP_ACCEPT_CHARSET”     當前請求的Accept-Charset: 頭資訊的內容。例如:“iso-8859-1,*,utf-8”。 “HTTP_ACCEPT_ENCODING”    當前請求的Accept-Encoding: 頭資訊的內容。例如:“gzip”。 “HTTP_ACCEPT_LANGUAGE”    當前請求的Accept-Language: 頭資訊的內容。例如:“en”。 “HTTP_CONNECTION”       當前請求的Connection: 頭資訊的內容。例如:“Keep-Alive”。 “HTTP_HOST”           當前請求的Host: 頭資訊的內容。 “HTTP_REFERER”         連結到當前頁面的前一頁面的URL 地址。不是所有的使用者代理(瀏覽器)都會設定這個變數,而且有的還可以手工修改HTTP_REFERER。因此,這個變數不總是真實正確的。 “HTTP_USER_AGENT”       當前請求的User-Agent: 頭資訊的內容。該字串表明了訪問該頁面的使用者代理的資訊。
                 一個典型的例子是:Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586)。也可以使用get_browser() 得到此資訊。 “HTTPS”          如果指令碼是通過HTTPS 協議被訪問,則被設為一個非空的值。 “REMOTE_ADDR”      正在瀏覽當前頁面使用者的IP 地址。 “REMOTE_HOST”      正在瀏覽當前頁面使用者的主機名。反向域名解析基於該使用者的REMOTE_ADDR。
              注: 必須配置Web 伺服器來建立此變數。例如Apache 需要在httpd.conf 中有HostnameLookups On。參見gethostbyaddr()。 “REMOTE_PORT”      使用者連線到伺服器時所使用的埠。 “SCRIPT_FILENAME”   當前執行指令碼的絕對路徑名。              注: 如果指令碼在CLI 中被執行,作為相對路徑,例如file.php 或..
/file.php,$_SERVER[‘SCRIPT_FILENAME’] 將包含使用者指定的相對路徑。 “SERVER_ADMIN”     該值指明瞭Apache 伺服器配置檔案中的SERVER_ADMIN 引數。如果指令碼執行在一個虛擬主機上,則該值是那個虛擬主機的值。 “SERVER_PORT”     伺服器所使用的埠。預設為“80”。如果使用SSL 安全連線,則這個值為使用者設定的HTTP 埠。 “SERVER_SIGNATURE”  包含伺服器版本和虛擬主機名的字串。 “PATH_TRANSLATED”   當前指令碼所在檔案系統(不是文件根目錄)的基本路徑。這是在伺服器進行虛擬到真實路徑的映像後的結果。              注: PHP 4.3.2 之後,PATH_TRANSLATED 在Apache 2 SAPI 模式下不再和 Apache1 一樣隱含賦值,而是若 Apache 不生成此值,PHP 便自己生成並將其值放入SCRIPT_FILENAME 伺服器常量中。
             這個修改遵守了CGI 規範,PATH_TRANSLATED 僅在PATH_INFO 被定義的條件下才存在。              Apache
2 使用者可以使用httpd.conf 中的AcceptPathInfo On 來定義PATH_INFO。 “SCRIPT_NAME”     包含當前指令碼的路徑。這在頁面需要指向自己時非常有用。FILE 包含當前檔案的絕對路徑和檔名(例如包含檔案)。 “REQUEST_URI”     訪問此頁面所需的URI。例如,“/index.html”。 “PHP_AUTH_DIGEST”  當作為Apache 模組執行時,進行HTTP Digest 認證的過程中,此變數被設定成客戶端傳送的“Authorization”HTTP 頭內容(以便作進一步的認證操作)。 “PHP_AUTH_USER”   當PHP 執行在Apache 或IIS(PHP 5 是ISAPI)模組方式下,並且正在使用HTTP 認證功能,這個變數便是使用者輸入的使用者名稱。 “PHP_AUTH_PW”    當PHP 執行在Apache 或IIS(PHP 5 是ISAPI)模組方式下,並且正在使用HTTP 認證功能,這個變數便是使用者輸入的密碼。 HTTP_CLIENT_IP    取得使用者的IP程式碼;