Next.js解決axios獲取真實ip問題方法分析
前言
上篇文章中我使用了ip2region獲取到了ip歸屬地,但是我發(fā)現(xiàn)我的框架next.js通過k8s發(fā)布到生產(chǎn)環(huán)境之后發(fā)現(xiàn)獲取的ip是pod的ip而不是真實的外網(wǎng)ip,下面就來談?wù)勅绾谓鉀Q!
操作
首先我想到的是可能是阿里云ACK自己的問題,于是問了他們客服之前機器人給了下面的解決方案:
ACK容器集群應(yīng)用Pod如何獲取客戶端真實IP
ACK容器集群Pod如何獲取客戶端真實IP?
如果您未使用WAF,且集群是通過SLB暴露的業(yè)務(wù),請檢查Service的YAML文件,確保externaltrafficpolicy為Local模式,該模式下可獲取到客戶端真實IP。如果集群是通過Ingress暴露的業(yè)務(wù),請檢查nginx-ingress-lb的externaltrafficpolicy,確保externaltrafficpolicy為Local模式。如果您使用了WAF,請參見K8s Ingress獲取真實IP地址處理。
客服解決方案
發(fā)現(xiàn)解決不了問題之后,下面是他們客服給的解決方案:
1、查看service中nginx-ingress-lb外部流量策略是不是Local


發(fā)現(xiàn)設(shè)置的就是Local,所以通過!
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è)置好即生效,通過!
3、查看deploy無狀態(tài)的nginx-ingress-controller日志中展示是不是真實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 []
通過上面顯示,發(fā)現(xiàn)每次使用的pod的ip都是axios請求的,真實的都是客戶端瀏覽器請求的,這是為啥呢???
分析
于是我就開始分析起造成的原因,因為客戶端瀏覽器發(fā)起的請求就是真實的ip,服務(wù)端next.js中的axios發(fā)起的請求就是pod的ip,再結(jié)合之前next.js遇到的cookie問題,我終于破案了!
心機之蛙一直摸你肚子!
瀏覽器請求(真實ip)->nginx-ingress-controller->spring cloud gateway
next.js所在的pod中的axios請求(pod ip)->nginx-ingress-controller->spring cloud gateway
分析問題:
也就是說瀏覽器請求的X-Forwarded-For請求頭使用的就是外部真實的ip,而next.js所在的pod的axios發(fā)起的請求頭中我沒有設(shè)置X-Forwarded-For,所以它默認使用的是pod的ip。
解決:
只要在next.js中設(shè)置axios請求頭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這樣真實的ip就會設(shè)置到axios請求頭中,完美解決?。?!
IP屬地:中國|0|江蘇省|南京市|電信
總結(jié)
1、首先排除是阿里云ACK的問題
2、分析后才知道是next.js使用axios導(dǎo)致的,修改請求頭即可解決。
以上就是Next.js解決axios獲取真實ip問題方法分析的詳細內(nèi)容,更多關(guān)于Next.js axios獲取ip的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Bootstrap滾動監(jiān)聽組件scrollspy.js使用方法詳解
這篇文章主要為大家詳細介紹了Bootstrap滾動監(jiān)聽組件scrollspy.js的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07
javascript實現(xiàn)俄羅斯方塊游戲的思路和方法
至于俄羅斯方塊的話,有很多的難點,如果有JS去寫的話,要考慮到碰撞啊,邊界啊,下落等問題,本文這些問題大部分都有考慮到,這里給大家提供一部分思路,拋磚引玉,有需要的小伙伴可以參考下。2015-04-04
javascript使用數(shù)組的push方法完成快速排序
排序的方法有很多,本節(jié)為大家介紹的是使用數(shù)組的push方法完成快速排序,當然你也可以舉一反三2014-09-09
Invalid?Host?header問題該如何解決的幾種方式
Invalid Host header是一個常見的錯誤信息,通常發(fā)生在Web應(yīng)用程序中,下面這篇文章主要給大家介紹了關(guān)于Invalid?Host?header問題該如何解決的幾種方式,需要的朋友可以參考下2024-09-09
在Javascript里訪問SharePoint列表數(shù)據(jù)的實現(xiàn)方法
在進行SharePoint訂制的時候經(jīng)常會遇到開發(fā)手段受限制的問題,比如通常公司都會限制服務(wù)器的訪問以及部署,很多開發(fā)都只能夠在客戶端來進行2011-05-05

