Appearance
用 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 一分钟内不重复请求上游:
jsconst 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。