日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Nginx >内容正文

Nginx

Nginx 反向代理时获取用户的真实 IP

發(fā)布時(shí)間:2024/4/13 Nginx 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Nginx 反向代理时获取用户的真实 IP 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在平時(shí)我們開發(fā)后端程序的過程中,應(yīng)該多多少少都會(huì)碰到記錄客戶端 IP 的場(chǎng)景,例如我之前寫過的 APP 用戶的一個(gè)審計(jì)功能,就需要獲取用戶的 IP 地址;還有廣告系統(tǒng)里面,也是需要獲取用戶的 IP 地址,有時(shí)這個(gè) IP 地址會(huì)被用來標(biāo)識(shí)用戶的,因此需要比較準(zhǔn)確得獲取到用戶的地址。當(dāng)然,在開始本文的內(nèi)容之前還是有必要強(qiáng)調(diào)一下我們現(xiàn)在的網(wǎng)絡(luò)大環(huán)境的,在使用 IP 的時(shí)候,我們一定要記住有兩個(gè)東西很關(guān)鍵,一個(gè)是網(wǎng)關(guān),一個(gè)是代理。

網(wǎng)關(guān)其實(shí)好理解,說簡(jiǎn)單一些的就路由器吧,因?yàn)?IPv4 的地址空間是有限的,所以就有了局域網(wǎng)共用一個(gè)公網(wǎng) IP 的事實(shí)。這在一個(gè)集體里面很容易出現(xiàn),例如家庭、學(xué)校,如果我們不加分辨得直接就使用 IP 來記錄或者屏蔽,那么很容易出問題,如果將這個(gè)問題再擴(kuò)大化一點(diǎn),那就是移動(dòng)端,因?yàn)槲覀冎酪苿?dòng)端都是通過連接信號(hào)塔進(jìn)行數(shù)據(jù)通信的,那么對(duì)于一個(gè)范圍內(nèi)的同一運(yùn)營(yíng)商來說,IP 地址就很可能是一樣的,這是移動(dòng)開發(fā)中一個(gè)很關(guān)鍵的點(diǎn);還有就是代理,很多公司對(duì)于網(wǎng)絡(luò)都是封鎖得很嚴(yán)厲的,所以所有的對(duì)外流量都通過一個(gè)代理交流,這也就導(dǎo)致了很多情況下都是同一個(gè)代理出來的都是一個(gè) IP,這也是一個(gè)非常重要的問題,很容易一棍子打死一船人。

OK,閑話扯完了,回到主題,在后端程序中,一般客戶端/前端的流量都不會(huì)直接就打到后端的應(yīng)用上,正常最少都會(huì)加一層反向代理,稍復(fù)雜一些的還會(huì)有負(fù)載均衡啥的,這也給我們提取客戶端 IP 帶來了很大的麻煩,所以我這里就以 Nginx 為例,說說如何更好得獲取正確的 IP 值。

下面下來一段我用了好多年的 Nginx 配置,夸張點(diǎn)說就祖?zhèn)鞯陌?#xff1a;

這里會(huì)出現(xiàn)了好幾個(gè)和 IP 有關(guān)的字段,這也是獲取 IP 的關(guān)鍵,對(duì)于這些字段如果我們細(xì)致得了解了它的來源和原理之后,那么獲取相對(duì)準(zhǔn)確的 IP 也就沒那么困難了,下面就一一進(jìn)行介紹:

Remote Addr

remote_addr 這個(gè)字段不是 http 里面的概念,其實(shí)是 tcp 的概念,表示的是當(dāng)前連接的對(duì)端的地址,也就是說:

  • 如果在瀏覽器和 Nginx 之間不存在其他代理,那么這個(gè)字段就是真實(shí)的 IP
  • 但是,一旦瀏覽器和 Nginx 之間存在代理,那么這個(gè)字段的值就是最后一個(gè)代理的地址

X-Real-IP

正如配置中所示,HTTP 中其實(shí)不存在這個(gè) Header,但是在 Nginx 中習(xí)慣于用來標(biāo)識(shí)用戶的真實(shí)地址,至于是否真的是客戶端的地址,看前面的 remote_addr 的解釋我們就清楚了。

X-Forwarded-For

這個(gè)就有意思了,X-Forwarded-For 表示在客戶端訪問 Nginx 的過程中如果需要經(jīng)過 HTTP 代理或者負(fù)載均衡服務(wù)器,可以被用來獲取最初發(fā)起請(qǐng)求的客戶端的 IP 地址,這個(gè)消息首部成為事實(shí)上的標(biāo)準(zhǔn)。怎么說,其實(shí)就是一個(gè) HTTP 請(qǐng)求從瀏覽器發(fā)出,每經(jīng)過一個(gè) HTTP 代理或者負(fù)載均衡,都會(huì)在這個(gè) Header 里面添加一條記錄(當(dāng)然,這是規(guī)定,你不遵守我也沒辦法),所以對(duì)于一個(gè)請(qǐng)求來說,X-Forwarded-For Header 的值列表里面的第一個(gè)值應(yīng)該就是客戶端的地址,及時(shí)經(jīng)過了 N 多的代理和負(fù)載均衡。

但是,這畢竟不是真正的標(biāo)準(zhǔn),所以我們不能期望 100% 一定有這個(gè),但是根據(jù)我的經(jīng)驗(yàn),對(duì)于一些比較成熟的反向代理軟件 例如 Nginx/Squid 都是有的,所以大多數(shù)情況下都可以通過這個(gè)字段獲取到真實(shí)值。

X-Forwarded-Host

好吧,這個(gè) Header 是亂入的,它和客戶端的 IP 沒啥關(guān)系,它其實(shí)是標(biāo)識(shí)客戶端發(fā)起請(qǐng)求時(shí)的 Host 的地址,我們可以通過這個(gè) Header 來獲取客戶端是訪問的哪個(gè) Host 進(jìn)來的。

結(jié)論

所以通過上面的介紹,我們知道,其實(shí)就只有兩個(gè)東西,分別是 remote_addr 和 X-Forwarded-For,如果中間存在不可控的代理,那么我們應(yīng)該優(yōu)先通過 X-Forwarded-For 的第一個(gè)值來獲取客戶端真實(shí) IP;如果中間的代理都是可控的,那么我們優(yōu)先通過 remote_addr 來獲取客戶端真實(shí)的 IP,而且這個(gè) IP 是不可偽造的。

轉(zhuǎn)載于:https://www.cnblogs.com/makor/p/Nginx-fan-xiang-dai-li-shi-huo-qu-yong-hu-de-zhen-.html

總結(jié)

以上是生活随笔為你收集整理的Nginx 反向代理时获取用户的真实 IP的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。