Next.js解決axios獲取真實(shí)ip問(wèn)題方法分析
前言
上篇文章中我使用了ip2region獲取到了ip歸屬地,但是我發(fā)現(xiàn)我的框架next.js
通過(guò)k8s發(fā)布到生產(chǎn)環(huán)境之后發(fā)現(xiàn)獲取的ip是pod的ip而不是真實(shí)的外網(wǎng)ip,下面就來(lái)談?wù)勅绾谓鉀Q!
操作
首先我想到的是可能是阿里云ACK自己的問(wèn)題,于是問(wèn)了他們客服之前機(jī)器人給了下面的解決方案:
ACK容器集群應(yīng)用Pod如何獲取客戶端真實(shí)IP
ACK容器集群Pod如何獲取客戶端真實(shí)IP?
如果您未使用WAF,且集群是通過(guò)SLB暴露的業(yè)務(wù),請(qǐng)檢查Service的YAML文件,確保externaltrafficpolicy為L(zhǎng)ocal模式,該模式下可獲取到客戶端真實(shí)IP。如果集群是通過(guò)Ingress暴露的業(yè)務(wù),請(qǐng)檢查nginx-ingress-lb的externaltrafficpolicy,確保externaltrafficpolicy為L(zhǎng)ocal模式。如果您使用了WAF,請(qǐng)參見(jiàn)K8s Ingress獲取真實(shí)IP地址處理。
客服解決方案
發(fā)現(xiàn)解決不了問(wèn)題之后,下面是他們客服給的解決方案:
1、查看service中nginx-ingress-lb
外部流量策略是不是Local
發(fā)現(xiàn)設(shè)置的就是Local,所以通過(guò)!
2、設(shè)置nginx-configuration
執(zhí)行下面命令:
kubectl -n kube-system edit cm nginx-configuration
在data中添加下面內(nèi)容:
compute-full-forwarded-for: "true" forwarded-for-header: "X-Forwarded-For" use-forwarded-headers: "true" enable-real-ip: "true"
設(shè)置好即生效,通過(guò)!
3、查看deploy無(wú)狀態(tài)的nginx-ingress-controller
日志中展示是不是真實(shí)ip
172.22.32.48 - [172.22.32.48] - - [31/Aug/2023:11:49:00 +0800] "GET /api/space/info/urlCategory/zhangwei HTTP/1.1" 200 20188 "-" "axios/1.5.0" 320 0.059 [seaurl-testapi-seaurl-gatewayserver-svc-7777] 172.22.32.57:7777 20188 0.059 200 9c6a2589d7926d266abe56b6e4b38488 testapi.seaurl.com []
114.222.247.210 - [114.222.247.210] - - [31/Aug/2023:11:49:01 +0800] "GET /api/space/crud/urlCategory/zhangwei/categoryTreeList HTTP/2.0" 200 20188 "https://test.seaurl.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" 56 0.027 [seaurl-testapi-seaurl-gatewayserver-svc-7777] 172.22.32.57:7777 20188 0.027 200 e165866b16394694c332e82aa47de562 testapi.seaurl.com []
通過(guò)上面顯示,發(fā)現(xiàn)每次使用的pod的ip都是axios請(qǐng)求的,真實(shí)的都是客戶端瀏覽器請(qǐng)求的,這是為啥呢???
分析
于是我就開(kāi)始分析起造成的原因,因?yàn)榭蛻舳藶g覽器發(fā)起的請(qǐng)求就是真實(shí)的ip,服務(wù)端next.js中的axios發(fā)起的請(qǐng)求就是pod的ip,再結(jié)合之前next.js遇到的cookie問(wèn)題,我終于破案了!
心機(jī)之蛙一直摸你肚子!
瀏覽器請(qǐng)求(真實(shí)ip)->nginx-ingress-controller->spring cloud gateway
next.js所在的pod中的axios請(qǐng)求(pod ip)->nginx-ingress-controller->spring cloud gateway
分析問(wèn)題:
也就是說(shuō)瀏覽器請(qǐng)求的X-Forwarded-For
請(qǐng)求頭使用的就是外部真實(shí)的ip,而next.js所在的pod的axios發(fā)起的請(qǐng)求頭中我沒(méi)有設(shè)置X-Forwarded-For
,所以它默認(rèn)使用的是pod的ip。
解決:
只要在next.js中設(shè)置axios請(qǐng)求頭X-Forwarded-For
即可,如下所示:
export const getServerSideProps = wrapper.getServerSideProps(store => async (ctx) => { const ip = ctx.req.headers['x-forwarded-for'] || ctx.req.connection.remoteAddress; axios.defaults.headers.cookie = ctx.req.headers.cookie || null axios.defaults.headers['X-Forwarded-For'] = ip
這樣真實(shí)的ip就會(huì)設(shè)置到axios請(qǐng)求頭中,完美解決!??!
IP屬地:中國(guó)|0|江蘇省|南京市|電信
總結(jié)
1、首先排除是阿里云ACK的問(wèn)題
2、分析后才知道是next.js使用axios導(dǎo)致的,修改請(qǐng)求頭即可解決。
以上就是Next.js解決axios獲取真實(shí)ip問(wèn)題方法分析的詳細(xì)內(nèi)容,更多關(guān)于Next.js axios獲取ip的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
屏蔽IE彈出"您查看的網(wǎng)頁(yè)正在試圖關(guān)閉窗口,是否關(guān)閉此窗口"的方法
本篇文章主要是對(duì)屏蔽IE彈出"您查看的網(wǎng)頁(yè)正在試圖關(guān)閉窗口,是否關(guān)閉此窗口"的方法進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-12-12解決layui 表單元素radio不顯示渲染的問(wèn)題
今天小編就為大家分享一篇解決layui 表單元素radio不顯示渲染的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09javascript從image轉(zhuǎn)換為base64位編碼的String
選擇webview把image以base64位編碼的方式傳給本地應(yīng)用,就不需要再取一次圖片文件了,從而提高了速度2014-07-07JS簡(jiǎn)單實(shí)現(xiàn)父子窗口傳值功能示例【未使用iframe框架】
這篇文章主要介紹了JS簡(jiǎn)單實(shí)現(xiàn)父子窗口傳值功能,結(jié)合具體實(shí)例形式分析了javascript實(shí)現(xiàn)不使用iframe框架進(jìn)行窗口之間簡(jiǎn)單傳值的相關(guān)操作技巧,需要的朋友可以參考下2017-09-09js獲取網(wǎng)頁(yè)可見(jiàn)區(qū)域、正文以及屏幕分辨率的高度
這篇文章主要介紹了js獲取網(wǎng)頁(yè)的各種高度,例如可見(jiàn)區(qū)域、正文以及屏幕分辨率的高度,需要的朋友可以參考下2014-05-05javascript實(shí)現(xiàn)的文字加密解密
javascript實(shí)現(xiàn)的文字加密解密...2007-06-06JS實(shí)現(xiàn)定時(shí)頁(yè)面彈出類(lèi)似QQ新聞的提示框
類(lèi)似QQ新聞的提示框要求頁(yè)面每隔半小時(shí)彈出一次提示消息,下面有個(gè)不錯(cuò)的實(shí)現(xiàn)方法,感興趣的朋友可以參考下2013-11-11微信小程序填寫(xiě)用戶頭像和昵稱實(shí)現(xiàn)方法淺析
這篇文章主要介紹了微信小程序填寫(xiě)用戶頭像和昵稱實(shí)現(xiàn)方法,我們使用小程序往往能碰到提示允許獲取用戶頭像昵稱,這種功能怎么實(shí)現(xiàn)呢?本篇文章帶你探索2023-02-02有趣的script標(biāo)簽用getAttribute方法來(lái)自腳本吧
有趣的script標(biāo)簽用getAttribute方法來(lái)自腳本吧...2007-03-03