php 獲取本機外網/公網IP的程式碼
阿新 • • 發佈:2021-11-18
一般都是用 $_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” 請求開始時的時間戳。從PHP5.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程式碼;