一般都是用 $_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代碼;