標(biāo)簽(空格分隔): nignx 負(fù)載均衡 client-ip
1.如果只有一層代理术辐,這兩個(gè)頭的值就是一樣的
2.多層代理
- X-Forwarded-For: header包含這樣一行
X-Forwarded-For: 1.1.1.1, 2.2.2.2, 3.3.3.3
- X-Real-Ip:沒(méi)有相關(guān)標(biāo)準(zhǔn)娱挨,上面的例子,如果配置了X-Read-IP村斟,可能會(huì)有兩種情況
// 最后一跳是正向代理,可能會(huì)保留真實(shí)客戶端IP
X-Real-IP: 1.1.1.1
// 最后一跳是反向代理弄兜,比如Nginx少欺,一般會(huì)是與之直接連接的客戶端IP
X-Real-IP: 3.3.3.3
3.CDN情況下:
- 如果從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的底循。
- CDN設(shè)置了X-Forwarded-For,我們這里又設(shè)置了一次槐瑞,且值為$proxy_add_x_forwarded_for的話熙涤,那么X-Forwarded-For的內(nèi)容變成 ”客戶端IP,Nginx負(fù)載均衡服務(wù)器IP“如果是這種情況的話,那后端的程序通過(guò)X-Forwarded-For獲得客戶端IP困檩,則取逗號(hào)分隔的第一項(xiàng)即可祠挫。
4.總結(jié):
他在正向(如squid)反向(如nginx)代理中都是標(biāo)準(zhǔn)用法,而正向代理中是沒(méi)有x-real-ip相關(guān)的標(biāo)準(zhǔn)的悼沿,也就是說(shuō)等舔,如果用戶訪問(wèn)你的 nginx反向代理之前,還經(jīng)過(guò)了一層正向代理糟趾,你即使在nginx中配置了x-real-ip慌植,取到的也只是正向代理的IP而不是客戶端真實(shí)IP
大部分nginx反向代理配置文章中都沒(méi)有推薦加上x(chóng)-real-ip ,而只有x-forwarded-for义郑,因此更通用的做法自然是取x-forwarded-for
多級(jí)代理很少見(jiàn)蝶柿,只有一級(jí)代理的情況下二者是等效的
如果有多級(jí)代理,x-forwarded-for效果是大于x-real-ip的非驮,可以記錄完整的代理鏈路