Skip to content

用 Cloudflare Workers 搭一个免费 IP 归属地查询接口

场景很常见:个人博客、小工具站想给访客显示"你的 IP 归属地",但不想为这点功能去注册云服务、申请 key、担心被限流。Cloudflare Workers 的免费额度(每天 10 万次请求)对个人项目绰绰有余,再配一个免注册的 IP 归属地 API 做上游,十几分钟就能搭好。这篇文章从零写一遍。

一、整体思路

访客请求你的 Worker → Worker 从请求头拿到访客 IP(CF-Connecting-IP)→ 调上游 IP 归属地接口 → 把结果返回给前端。前端拿到数据展示省市、运营商。全程不需要自己的服务器,也不用备案。

二、上游接口选哪个?

需求就三条:免注册、免鉴权、返回字段够用。以 IP9 为例(https://ip9.com.cn/get),免费版直接返回国家、省市、运营商、城市中心经纬度等字段:不传参数时自动查当前请求方 IP,传 ?ip= 查指定 IP,IPv4/IPv6 都支持。用它做上游,Worker 代码里连密钥都不用配。

三、写 Worker 代码

js
export default {
  async fetch(request, env, ctx) {
    const url = new URL(request.url);
    // 访客真实 IP:Cloudflare 在请求头里自动注入
    const visitorIp = request.headers.get('CF-Connecting-IP') || '';

    // 1) 查访客自己的归属地:/ip
    if (url.pathname === '/ip') {
      const api = await fetch('https://ip9.com.cn/get');
      const data = await api.json();
      return new Response(JSON.stringify(data), {
        headers: { 'content-type': 'application/json; charset=utf-8' }
      });
    }

    // 2) 查指定 IP:/ip?ip=1.2.3.4
    const target = url.searchParams.get('ip');
    if (target) {
      const api = await fetch('https://ip9.com.cn/get?ip=' + encodeURIComponent(target));
      const data = await api.json();
      return new Response(JSON.stringify(data), {
        headers: { 'content-type': 'application/json; charset=utf-8' }
      });
    }

    // 3) 一个简单的 HTML 首页,方便直接打开看效果
    return new Response(
      '<h3>IP 归属地查询</h3><p>你的 IP: ' + visitorIp + '</p>' +
      '<p>用法: /ip 查自己,/ip?ip=1.2.3.4 查指定 IP</p>',
      { headers: { 'content-type': 'text/html; charset=utf-8' } }
    );
  }
}

四、部署到 Cloudflare Workers

两种方式任选:

方式一:网页版(最快)。登录 Cloudflare 控制台 → Workers & Pages → 创建 Worker → 把上面代码粘进 worker.js → 保存并部署。完事,分配的域名形如 xxx.workers.dev

方式二:命令行(适合要纳入 git 管理的项目)

bash
npm install -g wrangler
wrangler login
wrangler init ip-lookup
cd ip-lookup && wrangler deploy

五、验证一下

bash
# 查自己的归属地
curl https://你的worker域名.workers.dev/ip
# 查指定 IP
curl 'https://你的worker域名.workers.dev/ip?ip=114.114.114.114'

返回的 JSON 里重点看这几个字段:prov(省)、city(市)、isp(运营商)、lng/lat(城市中心经纬度)。如果返回 ret=400,说明 ip 参数格式不对。

六、几个注意事项

  • 限流:上游免费接口通常有频率限制(IP9 免费版 60 次/分钟/IP),个人站够用;访问量大了就在 Worker 里加一层缓存,相同 IP 一分钟内不重复请求上游:

    js
    const cacheKey = new Request(url, request);
    const cached = await caches.default.match(cacheKey);
    if (cached) return cached;
    // ... 上游请求 ...
    ctx.waitUntil(caches.default.put(cacheKey, response.clone()));
  • 字段选择:展示归属地用 prov + city 就够;要做更细的判断(区分家庭宽带/机房/企业),需要上游返回 ip_type 字段(IP9 VIP 版提供)。

  • 隐私与合规:别把访客 IP 写进日志或展示给其他人看。"查自己的 IP"没问题,做成公开的"查任意 IP"工具就要考虑合规,建议只保留查询功能、不留存记录。

总结

Cloudflare Workers + 免注册 IP 归属地 API,是个人项目成本最低的归属地查询方案。核心就三步:取 CF-Connecting-IP、调上游 https://ip9.com.cn/get、返回 JSON。代码就上面那么多,复制就能跑。想看接口返回的完整字段说明,去 IP9 官网 https://www.ip9.com.cn