Node koa服務(wù)器實(shí)現(xiàn)獲取客戶端ip
1. 確保請(qǐng)求不是來自本地
如果你在本地測試,瀏覽器直接訪問 localhost 或 127.0.0.1,服務(wù)端自然只能看到本地 IP。要測試真實(shí) IP,可以:
- 另一臺(tái)設(shè)備(如手機(jī)或其他電腦)訪問你的服務(wù)。
- 部署到公網(wǎng)服務(wù)器,通過公網(wǎng) IP 或域名訪問。
2. 正確處理反向代理
如果服務(wù)部署在 Nginx 等反向代理后,需確保代理正確傳遞客戶端的 IP 地址。以下是常見問題的解決方案:
(1) 在 Koa 中啟用代理信任Koa 默認(rèn)不信任代理的 X-Forwarded-For 頭,需手動(dòng)啟用:
const Koa = require('koa'); const app = new Koa(); // 啟用代理信任(如果部署在反向代理后) app.proxy = true; // 關(guān)鍵!告訴 Koa 信任反向代理的頭部 // 其他中間件和路由...
(2) 從請(qǐng)求頭中提取真實(shí) IP修改路由代碼,優(yōu)先從 X-Forwarded-For 中提取 IP,并處理可能的多個(gè) IP(如多層代理):
router.get('/get-ip', (ctx) => { // 從 X-Forwarded-For 中提取客戶端 IP(處理多個(gè)代理的情況) const forwardedIps = ctx.request.get('X-Forwarded-For') || ''; const clientIP = forwardedIps.split(',')[0]?.trim() || ctx.ip; ctx.body = { ip: clientIP }; });
(3) 檢查其他可能頭部有些代理服務(wù)器(如 Nginx)會(huì)用 X-Real-IP 傳遞真實(shí) IP,可以補(bǔ)充檢查:
const clientIP = ctx.get('X-Real-IP') || forwardedIps.split(',')[0]?.trim() || ctx.ip;
3. 驗(yàn)證反向代理配置
如果使用 Nginx,確保配置中包含傳遞 IP 的頭部:
location / { proxy_pass http://localhost:3000; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; }
完整代碼示例
const Koa = require('koa'); const Router = require('@koa/router'); const app = new Koa(); const router = new Router(); // 啟用代理信任(關(guān)鍵?。? app.proxy = true; router.get('/get-ip', (ctx) => { // 嘗試從 X-Forwarded-For 中提取第一個(gè) IP(適用于反向代理) const forwardedIps = ctx.get('X-Forwarded-For') || ''; const clientIP = forwardedIps.split(',')[0]?.trim() || ctx.get('X-Real-IP') || ctx.ip; ctx.body = { ip: clientIP }; }); app.use(router.routes()); app.use(router.allowedMethods()); app.listen(3000, () => { console.log('Server is running on http://localhost:3000'); });
測試方法
- 本地測試:用 curl 或 Postman 從其他設(shè)備訪問你的服務(wù)。
- 公網(wǎng)測試:部署到服務(wù)器后,通過瀏覽器或工具訪問,觀察返回的 IP 是否與你的公網(wǎng) IP 一致。
如果問題仍未解決,請(qǐng)檢查
- 是否啟用了 app.proxy = true?
- 反向代理配置是否正確?
- 是否有防火墻或 CDN 干擾?
到此這篇關(guān)于Node koa服務(wù)器實(shí)現(xiàn)獲取客戶端ip的文章就介紹到這了,更多相關(guān)Node獲取客戶端ip內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談node如何優(yōu)雅地獲取mac系統(tǒng)版本
這篇文章主要和大家聊聊node如何優(yōu)雅地獲取mac系統(tǒng)版本,文中有詳細(xì)的代碼示例和流程步驟,對(duì)我們學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-06-06nodejs實(shí)現(xiàn)發(fā)出蜂鳴聲音(系統(tǒng)報(bào)警聲)的方法
這篇文章主要介紹了nodejs實(shí)現(xiàn)發(fā)出蜂鳴聲音(系統(tǒng)報(bào)警聲)的方法,結(jié)合實(shí)例形式分析了nodejs發(fā)出蜂鳴聲的原理及具體應(yīng)用方法,需要的朋友可以參考下2017-01-01150行Node.js實(shí)現(xiàn)的dns代理工具
這篇文章主要介紹了150行Node.js實(shí)現(xiàn)的dns代理工具,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08基于Alpine Linux構(gòu)建前端node-web鏡像步驟詳解
這篇文章主要為大家介紹了基于Alpine Linux構(gòu)建前端node-web鏡像步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11ChatGPT編程秀之最小元素的設(shè)計(jì)示例詳解
這篇文章主要為大家介紹了ChatGPT編程秀之最小元素的設(shè)計(jì)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Node.js編寫爬蟲的基本思路及抓取百度圖片的實(shí)例分享
這篇文章主要介紹了Node.js編寫爬蟲的基本思路及抓取百度圖片的實(shí)例分享,其中作者提到了需要特別注意GBK轉(zhuǎn)碼的轉(zhuǎn)碼問題,需要的朋友可以參考下2016-03-03