1. 程式人生 > >php獲取客戶端IP和php獲取伺服器端IP

php獲取客戶端IP和php獲取伺服器端IP

  1. 1.php獲取客戶端IP

    PHP獲取客戶端IP時,常使用 $_SERVER["REMOTE_ADDR"] 。但如果客戶端是使用代理伺服器來訪問,那取到的是代理伺服器的 IP 地址,而不是真正的客戶端 IP 地址。要想透過代理伺服器取得客戶端的真實 IP 地址,就要使用$_SERVER["HTTP_X_FORWARDED_FOR"]來讀取。

    但只有客戶端使用透明代理的情況下,$_SERVER["HTTP_X_FORWARDED_FOR"] 的值才是客戶端真正的IP(如果是多層代理,該值可能是由客戶端真正IP和多個代理伺服器的IP組成,由逗號“,”分隔);而在匿名代理欺騙性代理

    的情況下是代理伺服器的IP值(如果是多層代理,該值可能由多個代理伺服器的IP組成,由逗號“,”分隔);在高匿名代理的情況下是空值。

    REMOTE_ADDR 是你的客戶端跟你的伺服器握手時候的IP。如果使用了匿名代理REMOTE_ADDR將顯示代理伺服器的IP
    HTTP_CLIENT_IP 
    是代理伺服器傳送的HTTP頭。如果是超級匿名代理,則返回none值。同樣,REMOTE_ADDR也會被替換為這個代理伺服器的IP

    $_SERVER['REMOTE_ADDR']; //訪問端IP(有可能是使用者,有可能是代理伺服器的,也有可能是反向代理伺服器的)
    $_SERVER['HTTP_CLIENT_IP']; //

    代理端的(有可能存在,可偽造),未成標準,不一定伺服器都實現了。
    $_SERVER['HTTP_X_FORWARDED_FOR']; //
    使用者是在哪個IP使用的代理(有可能存在,也可以偽造),有標準定義,用來識別經過HTTP代理後的客戶端IP地址,格式:clientip,proxy1,proxy2。詳細解釋見。

    三個值區別如下:

    一、沒有使用代理伺服器的情況:

    REMOTE_ADDR = 您的 IP
    HTTP_VIA = 沒數值或不顯示
    HTTP_X_FORWARDED_FOR = 沒數值或不顯示

    二、使用透明代理伺服器的情況:Transparent Proxies

    REMOTE_ADDR = 最後一個代理伺服器 IP 
    HTTP_VIA = 代理伺服器 IP
    HTTP_X_FORWARDED_FOR = 您的真實 IP ,經過多個代理伺服器時,這個值類似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

    這類代理伺服器還是將您的資訊轉發給您的訪問物件,無法達到隱藏真實身份的目的。

    三、使用普通匿名代理伺服器的情況:Anonymous Proxies

    REMOTE_ADDR = 最後一個代理伺服器 IP 
    HTTP_VIA = 代理伺服器 IP
    HTTP_X_FORWARDED_FOR = 代理伺服器 IP ,經過多個代理伺服器時,這個值類似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

    隱藏了您的真實IP,但是向訪問物件透露了您是使用代理伺服器訪問他們的。

    四、使用欺騙性代理伺服器的情況:Distorting Proxies

    REMOTE_ADDR = 代理伺服器 IP 
    HTTP_VIA = 代理伺服器 IP 
    HTTP_X_FORWARDED_FOR = 隨機的 IP ,經過多個代理伺服器時,這個值類似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

    告訴了訪問物件您使用了代理伺服器,但編造了一個虛假的隨機IP代替您的真實IP欺騙它。

    五、使用高匿名代理伺服器的情況:High Anonymity Proxies (Elite proxies)

    REMOTE_ADDR = 代理伺服器 IP
    HTTP_VIA = 沒數值或不顯示
    HTTP_X_FORWARDED_FOR = 沒數值或不顯示 ,經過多個代理伺服器時,這個值類似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

    完全用代理伺服器的資訊替代了您的所有資訊,就象您就是完全使用那臺代理伺服器直接訪問物件。

    示例程式碼:

    1. //獲取使用者IP, 定義一個函式getIP()
    2. function getClientIP(){  
    3. if (getenv("HTTP_CLIENT_IP")) {  
    4.     $ip = getenv("HTTP_CLIENT_IP");  
    5. }elseif(getenv("HTTP_X_FORWARDED_FOR")) {  
    6.     $ip = getenv("HTTP_X_FORWARDED_FOR");  
    7. }elseif(getenv("REMOTE_ADDR")) {  
    8. $ip = getenv("REMOTE_ADDR");  
    9.     else$ip = "Unknow";  
    10. }  
    11. return$ip;  
    12. }  
    13. 或者  
    14. function getClientIp() {  
    15.     $ip = 'unknow';  
    16.     foreach (array(  
    17.                 'HTTP_CLIENT_IP',  
    18.                 'HTTP_X_FORWARDED_FOR',  
    19.                 'HTTP_X_FORWARDED',  
    20.                 'HTTP_X_CLUSTER_CLIENT_IP',  
    21.                 'HTTP_FORWARDED_FOR',  
    22.                 'HTTP_FORWARDED',  
    23.                 'REMOTE_ADDR'as$key) {  
    24.         if (array_key_exists($key$_SERVER)) {  
    25.             foreach (explode(','$_SERVER[$key]) as$ip) {  
    26.                 $ip = trim($ip);  
    27.                 //會過濾掉保留地址和私有地址段的IP,例如 127.0.0.1會被過濾
    28.                 //也可以修改成正則驗證IP
    29.                 if ((bool) filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {  
    30.                     return$ip;  
    31.                 }  
    32.             }  
    33.         }  
    34.     }  
    35.     return$ip;  
    36. }  

    2.php獲取伺服器端IP

    伺服器端IP相關的變數
    a. $_SERVER["SERVER_NAME"],需要使用函式gethostbyname()獲得。這個變數無論在伺服器端還是客戶端均能正確顯示。

    b. $_SERVER["SERVER_ADDR"],在伺服器端測試:127.0.0.1(這個與httpd.conf中BindAddress的設定值相關)。在客戶端測試結果正確。

    1. /** 
    2. * 獲取伺服器端IP地址 
    3.  * @return string 
    4.  */
    5. function getServerIp() {   
    6.     if (isset($_SERVER)) {   
    7.         if($_SERVER['SERVER_ADDR']) {  
    8.             $server_ip = $_SERVER['SERVER_ADDR'];   
    9.         } else {   
    10.             $server_ip = $_SERVER['LOCAL_ADDR'];   
    11.         }   
    12.     } else {   
    13.         $server_ip = getenv('SERVER_ADDR');  
    14.     }   
    15.     return$server_ip;   
    16. }  
    17. 或者  
    18. function getServerIP(){      
    19.     returngethostbyname($_SERVER["SERVER_NAME"]);      
    20. }   

相關推薦

php獲取客戶IPphp獲取伺服器IP

1.php獲取客戶端IP 在PHP獲取客戶端IP時,常使用 $_SERVER["REMOTE_ADDR"] 。但如果客戶端是使用代理伺服器來訪問,那取到的是代理伺服器的 IP 地址,而不是真正的客戶端 IP 地址。要想透過代理伺服器取得客戶端的真實 IP 地址,就要

java 後臺獲取ipjs 獲取ip

java: 在jsp得到客戶端的ip地址有下面的方法 1.<input type="hidden" id="jiqiIP" name="jiqiIP"value="<%=reque

移動fixedinput獲取焦點軟鍵盤彈出影響定位的問題

在移動端使用fixed將按鈕定位在底部時,當input獲取焦點彈出軟鍵盤時,在安卓系統會獎底部的按鈕頂上去 // 檢測瀏覽器的resize事件,當高度過小時就可以判定為出現這種情況,這時把定位改成ab或者直接隱藏掉之類的。 var h = document.body.sc

go get獲取的依賴庫dep獲取的vendor目錄下的依賴庫不一致的問題------玩下Gopkg.toml

        程式碼: package main import ( "fmt" "github.com/satori/go.uuid" ) func main() { u1 := uuid.Must(uuid.NewV4()) fmt.P

關於php的兩個符號@$---php總會要知道的系列

在寫程式碼的時候,碰到了在函式和變數前家 @和$的的問題,於是就借這個機會,學習下php的傳值和傳引用這兩種方式 首先 @ 運算子只對表示式有效。對新手來說一個簡單的規則就是:如果能從某處得到值,就能在它前面加上 @ 運算子。例如,可以把它放在變數,函式和 inclu

java 反射機制 之 getMethods獲取所有公有方法 getDeclaredMethods 獲取本類所有方法

檔案結構: Person: package demo2; public class Person { private int age; private String name; public Person( String name,int ag

rabbitMQ mqtt外掛 伺服器的配置使用

上一篇部落格我寫了mqtt在android上實現的小栗子,這篇講解的是如何搭建訊息佇列,並且開啟mqtt外掛 1.安裝erlang和rubbitmq(這裡不做過多的講解了,一路確定改安裝路徑) 2.安裝完成初始化 初始化rabbitmq(下邊這個百度連線就可以) htt

tcp/ip 多執行緒伺服器的實現(參考tcp/ip網路程式設計)

執行緒的切換比程序快的多,因為它不需要切換資料區和堆 共享資料區和堆可以用來交換資訊 一、執行緒的建立 pthread_create()函式 #include<pthread.h> int prthread_create(pthread * thread,c

GET與POST比較-使用HTTP協議將客戶的請求傳送到伺服器的兩種方式

1、get是從伺服器上獲取資料,post是向伺服器傳送資料;2、 在客戶端,get方式在通過URL提交資料,資料在URL中可以看到,post方式資料放置在HTML HEADER內提交;3、 對於ge

rabbitMQ mqtt外掛 伺服器的配置使用

上一篇部落格我寫了mqtt在android上實現的小栗子,這篇講解的是如何搭建訊息佇列,並且開啟mqtt外掛 1.安裝erlang和rubbitmq(這裡不做過多的講解了,一路確定改安裝路徑) 2.安裝完成初始化 3.修改配置檔案 修改圖片中第一個

使用Struts 2將客戶JSON資料對映為伺服器Java物件

上文()介紹瞭如何將Java物件序列化成JSON格式並傳到客戶端。這篇文章就說說如何將客戶端的JSON資料對映為伺服器端的Java物件。 pom.xml 需要引入struts2-json-plugin包。 <dependencies> <depen

wcf客戶通過URL地址呼叫伺服器地址

如果想讓伺服器端地址以URL的形式提供給外部呼叫,也就是在IE位址列中輸入URL可看見。可以採用如下方式 在伺服器端的配置檔案中新增源資料地址配置,在serviceBehaviors中新增 伺服器端配置檔案 <?xml version="1.0" encodin

修改arm開發板ipuboot的環境變數ip

一,修改開發板uboot環境變數ipaddr 1.使用secureCRT串列埠工具連線開發板。 2.啟動開發板,倒數2秒按任意鍵進入boot選單介面。 3.輸入命令pri指令,得到開發板uboot

PHP獲取客戶服務器IP(轉)

light 代理ip pre 客戶端測試 function 變量 clas env 環境 客戶端的ip變量: $_SERVER[‘REMOTE_ADDR‘] :客戶端IP,也有可能是代理IP $_SERVER[‘HTTP_CLIENT_IP‘]:代理端的IP,可能存在,也可

php 獲取客戶的真實IP地址 檢查客戶從什麼地方過來的請求

/* * 函式功能: 獲取客戶端的真實IP地址 * * 為什麼要用這個函式? * 因為我們線上Web伺服器絕大部分都處於Netscaler(簡稱NS)後面,客戶端訪問的地址統一由NS排程 * 由NS排程的訪問其實就是NS做了一層代理, 這期間就有一個問題, 因為真實

PHP獲取客戶IP地址,服務器IP地址

客戶端 get sse spa gets static p地址 tip sta ============================================獲取客戶端IP==============================================

PHP 獲取客戶 IP 地址

先來了解一個變數的含義: $_SERVER['REMOTE_ADDR']:瀏覽當前頁面的使用者計算機的ip地址 $_SERVER['HTTP_CLIENT_IP']:客戶端的ip $_SERVER['HTTP_X_FORWARDED_FOR']:瀏覽當前頁面的使用者計算機的閘道器

php獲取客戶ip地址或者伺服器ip地址

1.$_SERVER['REMOTE_ADDR'] 客戶端IP,有可能是使用者的IP,也可能是代理的IP。 2.$_SERVER['HTTP_CLIENT_IP'] 代理端的IP,可能存在可偽造。 3.$_SERVER['HTTP_X_FORWARDER_FOR'] 使用者是在哪個IP使用的代理,可

PHP 獲取客戶ip地址

一、如果沒有使用代理伺服器,   REMOTE_ADDR = 客戶端IP    HTTP_X_FORWARDED_FOR = 沒數值或不顯示   $ip = $_SERVER['REMOTE_ADDR']; 二、使用透明代理,   REMOTE_ADDR = 最後