濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > nginx做負(fù)載CDN加速獲取端真實(shí)ip

nginx做負(fù)載CDN加速獲取端真實(shí)ip

熱門標(biāo)簽:長(zhǎng)沙智能外呼系統(tǒng)中心 聯(lián)客智能語(yǔ)音外呼系統(tǒng)賬號(hào)格式 南昌語(yǔ)音外呼系統(tǒng)代理 成都移動(dòng)外呼系統(tǒng) 電銷機(jī)器人的效果 佛山外呼系統(tǒng)平臺(tái) 南寧智能外呼系統(tǒng)線路商 美圖手機(jī) 長(zhǎng)春外呼系統(tǒng)價(jià)格
nginx做負(fù)載CDN加速獲取端真實(shí)ip
在不用cdn的情況下,nginx做負(fù)載獲取真實(shí)ip時(shí),nginx配置如下:
Java代碼 
proxy_set_header        Host            $host; 
proxy_set_header        X-Real-IP       $remote_addr; 
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for; 
然后后端服務(wù)器獲取ip代碼:
Java代碼 

復(fù)制代碼
代碼如下:

String address = request.getHeader("X-Forwarded-For");
if (address != null address.length() > 0
!"unknown".equalsIgnoreCase(address)) {
return address;
}
address = request.getHeader("Proxy-Client-IP");
if (address != null address.length() > 0
!"unknown".equalsIgnoreCase(address)) {
return address;
}
address = request.getHeader("WL-Proxy-Client-IP");
if (address != null address.length() > 0
!"unknown".equalsIgnoreCase(address)) {
return address;
}
return request.getRemoteAddr();

這樣就能獲取到真實(shí)的IP,服務(wù)器測(cè)試一下:
不加cdn,獲取得IP:123.116.126.51(我當(dāng)前客戶端機(jī)器的真實(shí)IP)
然后加上加了cdn后,后去到的IP:123.116.126.51, 202.108.251.166(hosts指向cdn的ip)
即:client 真實(shí)IP,代理IP,google之,
X-Forwarded-For:簡(jiǎn)稱XFF頭,它代表客戶端,也就是HTTP的請(qǐng)求端真實(shí)的IP,只有在通過(guò)了HTTP 代理或者負(fù)載均衡服務(wù)器時(shí)才會(huì)添加該項(xiàng) 。
標(biāo)準(zhǔn)格式如下:
X-Forwarded-For: client1, proxy1, proxy2
從標(biāo)準(zhǔn)格式可以看出,X-Forwarded-For頭信息可以有多個(gè),中間用逗號(hào)分隔,第一項(xiàng)為真實(shí)的客戶端ip,剩下的就是曾經(jīng)經(jīng)過(guò)的代理或負(fù)載均衡的ip地址,經(jīng)過(guò)幾個(gè)就會(huì)出現(xiàn)幾個(gè)。
當(dāng)Nginx設(shè)置X-Forwarded-For等于$proxy_add_x_forwarded_for后會(huì)有兩種情況發(fā)生
1、如果從CDN過(guò)來(lái)的請(qǐng)求沒(méi)有設(shè)置X-Forwarded-For頭(通常這種事情不會(huì)發(fā)生),而到了我們這里Nginx設(shè)置將其設(shè)置為$proxy_add_x_forwarded_for的話,X-Forwarded-For的信息應(yīng)該為CDN的IP,因?yàn)橄鄬?duì)于Nginx負(fù)載均衡來(lái)說(shuō)客戶端即為CDN,這樣的話,后端的web程序時(shí)死活也獲得不了真實(shí)用戶的IP的。
2、CDN設(shè)置了X-Forwarded-For,我們這里又設(shè)置了一次,且值為$proxy_add_x_forwarded_for的話,那么X-Forwarded-For的內(nèi)容變成 ”客戶端IP,CDN的ip“如果是這種情況的話,那后端的程序通過(guò)X-Forwarded-For獲得客戶端IP,則取逗號(hào)分隔的第一項(xiàng)即可。
這個(gè)比較頭疼,如果只想獲取客戶端真實(shí)ip,那么只能修改我們后端代碼,如果有多個(gè),那么取第一個(gè)。這不是我想要的,
那么怎么樣才能不修改就能真實(shí)IP呢?
Nginx中還有一個(gè)$http_x_forwarded_for變量,這個(gè)變量中保存的內(nèi)容就是請(qǐng)求中的X-Forwarded-For信息。如果后端獲得X-Forwarded-For信息的程序兼容性不好的話(沒(méi)有考慮到X-Forwarded-For含有多個(gè)IP的情況),最好就不要將X-Forwarded-For設(shè)置為 $proxy_add_x_forwarded_for。應(yīng)該設(shè)置為$http_x_forwarded_for或者干脆不設(shè)置!
上面這段話的意思是我們不加 $proxy_add_x_forwarded_for, 但是這樣不在cdn的情況下去會(huì)取不到真實(shí)IP,有沒(méi)有一個(gè)兩全齊美的方法呢?
經(jīng)過(guò)幾種配置之后,發(fā)現(xiàn)做如下配置:
Java代碼     
proxy_set_header X-Forwarded-For  $http_x_forwarded_for; 
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;     
這樣配置第一次獲取 $http_x_forwarded_for,如果不存在,那么獲取$proxy_add_x_forwarded_for。
這樣不管是否在cdn環(huán)境,都可以獲得一個(gè)客戶端IP。
(注:多層代理未測(cè)試)

標(biāo)簽:邵陽(yáng) 慶陽(yáng) 阜陽(yáng) 東營(yíng) 云浮 法律服務(wù) 沈陽(yáng) 新鄉(xiāng)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《nginx做負(fù)載CDN加速獲取端真實(shí)ip》,本文關(guān)鍵詞  nginx,做,負(fù)載,CDN,加速,獲取,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《nginx做負(fù)載CDN加速獲取端真實(shí)ip》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于nginx做負(fù)載CDN加速獲取端真實(shí)ip的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    光山县| 五寨县| 清水县| 扎兰屯市| 连云港市| 新丰县| 峨山| 西乌珠穆沁旗| 呼玛县| 志丹县| 施甸县| 广西| 岑巩县| 方正县| 图们市| 新河县| 南陵县| 靖江市| 宁海县| 上饶市| 定安县| 县级市| 武夷山市| 黄浦区| 定结县| 温州市| 磐安县| 寿阳县| 栖霞市| 聂荣县| 洛扎县| 赤水市| 吉木乃县| 桐乡市| 九台市| 客服| 木里| 剑河县| 临邑县| 达拉特旗| 安顺市|