**
在開發工作中,我們常常需要獲取客戶端的ip。一般獲取客戶端的ip位址的方法是:request.getremoteaddr();但是在通過了apache,squid等反向**軟體就不能獲取到客戶端的真實ip位址了。
原因:由於在客戶端和服務之間增加了中間**,因此伺服器無法直接拿到客戶端的ip,伺服器端應用也無法直接通過**請求的位址返回給客戶端。
現在圖示**上網和ip的關係:
第一種情況:不通過**上網,伺服器端拿到真實ip
第二種情況:通過**伺服器如:nginx,squid等一層**或多層**上網,如下圖:
需要注意的是x-forwarded-for和x-real-ip都不是http的正式協議頭,而是squid等反向**軟體最早引入的,之所以resin能拿到,是因為nginx裡一般預設都會這麼配置**的http請求:
location / ,從x-forwarded-for的定義來看,ips[0]才是原始客戶端ip,如果這個都不是,那拿第二個就更不靠譜了,我們平時檢驗的時候,可能是直接在內網掛**去訪問的,跟外面網友訪問經過的網路路徑不一樣,後面不停新增的是經過的每一層**ip才對,下面舉例說明;
request.getremoteaddr() 192.168.239.196
request.getheader("x-forwarded-for") 58.63.227.162, 192.168.237.178, 192.168.238.218
request.getheader("x-real-ip") 192.168.238.218
所以訪問的流程應該是這樣,客戶端58.63.227.162發出請求,經過192.168.237.178, 192.168.238.218兩層**,到了192.168.239.196這台nginx上,nginx就把x-real-ip頭設成了自己看到的remote_addr,也就是直接發給到他的192.168.238.218,這時候resin收到這個包,對resin來說直接發給他的remote_addr就是nginx的ip,也就是192.168.239.196,那麼resin裡面的request.getremoteaddr()就是192.168.239.196,那麼在resin裡拿最原始的ip邏輯(也就是拿能夠知道的最外層的ip)應該是這樣:
如果xff不為空,拿xff的左邊第乙個
如果xff為空,拿xri
如果xri為空,只能拿request.getremoteaddr(),也就是只能拿到最直接發給他的機器ip了,
其他都不可考究,參考**如下:
第一種**:
/**
* 從request物件中獲得客戶端ip,處理了http**伺服器和nginx的反向**擷取了ip
}
第二種**:
}第三種**:
}第三種是最合適的,最清晰理解的
獲取客戶端ip
1.統計訪問者ip位址 2.設定黑名單,黑名單的使用者不可以訪問聊天室。內容提要 這種情況下同樣透露了客戶端是使用了 伺服器 但編造了乙個虛假的隨機ip 220.4.251.159 代替客戶端的真實 ip來欺騙它 獲取客戶端 ip其實不是個簡單的活兒 因為存在 ip欺騙 和 問題 所以獲取客戶端的 ...
獲取客戶端IP位址
title generating test data author wufeng4552 date 2009 09 23 10 34 02 功能 獲客戶 ip位址 if object id getclientip isnot null drop proc getclientip go create ...
客戶端獲取IP位址
string ip request.getheader x forwarded for string regex 2 0 4 d 25 0 5 01 d d?2 0 4 d 25 0 5 01 d d?if ip null ip.length 0 ip.equalsignorecase locali...