Node koa服務(wù)器實(shí)現(xiàn)獲取客戶(hù)端ip
1. 確保請(qǐng)求不是來(lái)自本地
如果你在本地測(cè)試,瀏覽器直接訪(fǎng)問(wèn) localhost 或 127.0.0.1,服務(wù)端自然只能看到本地 IP。要測(cè)試真實(shí) IP,可以:
- 另一臺(tái)設(shè)備(如手機(jī)或其他電腦)訪(fǎng)問(wèn)你的服務(wù)。
- 部署到公網(wǎng)服務(wù)器,通過(guò)公網(wǎng) IP 或域名訪(fǎng)問(wèn)。
2. 正確處理反向代理
如果服務(wù)部署在 Nginx 等反向代理后,需確保代理正確傳遞客戶(hù)端的 IP 地址。以下是常見(jiàn)問(wèn)題的解決方案:
(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 中提取客戶(hù)端 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');
});
測(cè)試方法
- 本地測(cè)試:用 curl 或 Postman 從其他設(shè)備訪(fǎng)問(wèn)你的服務(wù)。
- 公網(wǎng)測(cè)試:部署到服務(wù)器后,通過(guò)瀏覽器或工具訪(fǎng)問(wèn),觀察返回的 IP 是否與你的公網(wǎng) IP 一致。
如果問(wèn)題仍未解決,請(qǐng)檢查
- 是否啟用了 app.proxy = true?
- 反向代理配置是否正確?
- 是否有防火墻或 CDN 干擾?
到此這篇關(guān)于Node koa服務(wù)器實(shí)現(xiàn)獲取客戶(hù)端ip的文章就介紹到這了,更多相關(guān)Node獲取客戶(hù)端ip內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
node實(shí)現(xiàn)簡(jiǎn)單的增刪改查接口實(shí)例代碼
在本篇文章里小編給大家整理的是關(guān)于node實(shí)現(xiàn)簡(jiǎn)單的增刪改查接口的相關(guān)實(shí)例內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。2019-08-08
node.js中的console.log方法使用說(shuō)明
這篇文章主要介紹了node.js中的console.log方法使用說(shuō)明,本文介紹了console.log的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下2014-12-12
Node.JS使用Sequelize操作MySQL的示例代碼
Node.JS提供了操作數(shù)據(jù)庫(kù)的基礎(chǔ)接口,本篇文章主要介紹了Node.JS使用Sequelize操作MySQL的示例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下2017-10-10
手把手教你通過(guò)nodejs快速搭建一個(gè)服務(wù)器
這篇文章主要給大家介紹了關(guān)于如何通過(guò)nodejs快速搭建一個(gè)服務(wù)器的相關(guān)資料,在node.js中創(chuàng)建一個(gè)服務(wù)器非常簡(jiǎn)單,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10
Node.js安裝詳細(xì)步驟教程(Windows版)詳解
這篇文章主要介紹了Node.js安裝詳細(xì)步驟教程(Windows版),本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09
詳解基于Node.js的HTTP/2 Server實(shí)踐
HTTP/2目前已經(jīng)逐漸的在各大網(wǎng)站上開(kāi)始使用,這篇文章主要介紹了詳解基于Node.js的HTTP/2 Server實(shí)踐,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05

