1. 确保请求不是来自本地
如果你在本地测试,浏览器直接访问 localhost 或 127.0.0.1,服务端自然只能看到本地 IP。要测试真实 IP,可以:
- 另一台设备(如手机或其他电脑)访问你的服务。
- 部署到公网服务器,通过公网 IP 或域名访问。
2. 正确处理反向代理
如果服务部署在 Nginx 等反向代理后,需确保代理正确传递客户端的 IP 地址。以下是常见问题的解决方案:
(1) 在 Koa 中启用代理信任Koa 默认不信任代理的 X-Forwarded-For 头,需手动启用:
const Koa = require('koa'); const app = new Koa(); // 启用代理信任(如果部署在反向代理后) app.proxy = true; // 关键!告诉 Koa 信任反向代理的头部 // 其他中间件和路由...
(2) 从请求头中提取真实 IP修改路由代码,优先从 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) 检查其他可能头部有些代理服务器(如 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(); // 启用代理信任(关键!) 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 从其他设备访问你的服务。
- 公网测试:部署到服务器后,通过浏览器或工具访问,观察返回的 IP 是否与你的公网 IP 一致。
如果问题仍未解决,请检查
- 是否启用了 app.proxy = true?
- 反向代理配置是否正确?
- 是否有防火墙或 CDN 干扰?
到此这篇关于Node koa服务器实现获取客户端ip的文章就介绍到这了,更多相关Node获取客户端ip内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
来源链接:https://www.jb51.net/javascript/3357634rl.htm
© 版权声明
本站所有资源来自于网络,仅供学习与参考,请勿用于商业用途,否则产生的一切后果将由您(转载者)自己承担!
如有侵犯您的版权,请及时联系3500663466#qq.com(#换@),我们将第一时间删除本站数据。
如有侵犯您的版权,请及时联系3500663466#qq.com(#换@),我们将第一时间删除本站数据。
THE END
暂无评论内容