在開發工作中,我們常常需要獲取客戶端的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,處理了
**伺服器和
nginx
的反向**擷取了ip
}第二種**:
第三種**:
php獲取客戶端IP和php獲取伺服器端IP
1.php獲取客戶端ip 在php獲取客戶端ip時,常使用 server remote addr 但如果客戶端是使用 伺服器來訪問,那取到的是 伺服器的ip 位址,而不是真正的客戶端ip 位址。要想透過 伺服器取得客戶端的真實ip 位址,就要使用 server http x forwarded fo...
PHP獲取客戶端和伺服器端IP
客戶端ip相關的變數 1.server remote addr 客戶端ip,有可能是使用者的ip,也有可能是 的ip。2.server http client ip 端的ip,可能存在,可偽造。3.server http x forwarded for 使用者是在哪個ip使用的 可能存在,可以偽造。...
oracle客戶端訪問伺服器端
1.客戶端工具 可以使用sqlplus,oacle sql developer,pl sql developer 最近專案用到了oracle,使用的是oracle10g,因為小組內有多人使用資料庫,並且oracle資料庫很佔內 存,就放在單獨的一台伺服器上,所以最好每個人都裝乙個oracle10g的...