Node koa服務(wù)器實現(xiàn)獲取客戶端ip
1. 確保請求不是來自本地
如果你在本地測試,瀏覽器直接訪問 localhost 或 127.0.0.1,服務(wù)端自然只能看到本地 IP。要測試真實 IP,可以:
- 另一臺設(shè)備(如手機或其他電腦)訪問你的服務(wù)。
- 部署到公網(wǎng)服務(wù)器,通過公網(wǎng) IP 或域名訪問。
2. 正確處理反向代理
如果服務(wù)部署在 Nginx 等反向代理后,需確保代理正確傳遞客戶端的 IP 地址。以下是常見問題的解決方案:
(1) 在 Koa 中啟用代理信任Koa 默認不信任代理的 X-Forwarded-For 頭,需手動啟用:
const Koa = require('koa');
const app = new Koa();
// 啟用代理信任(如果部署在反向代理后)
app.proxy = true; // 關(guān)鍵!告訴 Koa 信任反向代理的頭部
// 其他中間件和路由...
(2) 從請求頭中提取真實 IP修改路由代碼,優(yōu)先從 X-Forwarded-For 中提取 IP,并處理可能的多個 IP(如多層代理):
router.get('/get-ip', (ctx) => {
// 從 X-Forwarded-For 中提取客戶端 IP(處理多個代理的情況)
const forwardedIps = ctx.request.get('X-Forwarded-For') || '';
const clientIP = forwardedIps.split(',')[0]?.trim() || ctx.ip;
ctx.body = {
ip: clientIP
};
});
(3) 檢查其他可能頭部有些代理服務(wù)器(如 Nginx)會用 X-Real-IP 傳遞真實 IP,可以補充檢查:
const clientIP = ctx.get('X-Real-IP') || forwardedIps.split(',')[0]?.trim() || ctx.ip;
3. 驗證反向代理配置
如果使用 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 中提取第一個 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 一致。
如果問題仍未解決,請檢查
- 是否啟用了 app.proxy = true?
- 反向代理配置是否正確?
- 是否有防火墻或 CDN 干擾?
到此這篇關(guān)于Node koa服務(wù)器實現(xiàn)獲取客戶端ip的文章就介紹到這了,更多相關(guān)Node獲取客戶端ip內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談node如何優(yōu)雅地獲取mac系統(tǒng)版本
這篇文章主要和大家聊聊node如何優(yōu)雅地獲取mac系統(tǒng)版本,文中有詳細的代碼示例和流程步驟,對我們學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-06-06
nodejs實現(xiàn)發(fā)出蜂鳴聲音(系統(tǒng)報警聲)的方法
這篇文章主要介紹了nodejs實現(xiàn)發(fā)出蜂鳴聲音(系統(tǒng)報警聲)的方法,結(jié)合實例形式分析了nodejs發(fā)出蜂鳴聲的原理及具體應(yīng)用方法,需要的朋友可以參考下2017-01-01
基于Alpine Linux構(gòu)建前端node-web鏡像步驟詳解
這篇文章主要為大家介紹了基于Alpine Linux構(gòu)建前端node-web鏡像步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11

