用Worker造一个IP信息显示

1.前言

在使用像curl ip.sb这样的服务时,我萌生了自己创建一个的念头。由于CloudFlare的强大功能,我决定通过CloudFlare Workers来实现这样的服务。然而,在使用CloudFlare Worker的过程中,遇到了一些关于SSL/HTTPS的问题,尽管问题不算大。

2.workers的代码

以下是我使用的Workers代码:

addEventListener('fetch', (event) => {
  event.respondWith(handleRequest(event.request));
});

async function handleRequest(request) {
  // 获取请求的客户端 IP 地址
  const clientIP = request.headers.get('cf-connecting-ip');

  
  // 解析请求中的参数,根据参数决定返回的 IP 类型
  const params = new URL(request.url).searchParams;
  const ipType = params.get('type');

  // 根据 IP 类型构造响应
  let ipAddress;
  if (ipType === 'ipv4') {
    ipAddress = clientIP.includes(':') ? clientIP.split(':')[0] : clientIP;
  } else if (ipType === 'ipv6') {
    ipAddress = clientIP.includes(':') ? clientIP : '';
  } else {
    ipAddress = clientIP;
  }
 
  // 返回 IP 地址
  return new Response(ipAddress + '\n', {
    status: 200,
    headers: {
      'Content-Type': 'text/plain',
    },
  });
}

我将该服务绑定到了自定义域名:ip.at9.net。

3.使用

通过浏览器访问 ip.at9.net,可以直接显示当前的IP地址。同样,命令行终端使用 curl https://ip.at9.net 也能够直接获取IP。

4.总结

在实际测试中,我遇到了一个问题:“无法使用 curl ip.at9.net 返回IP地址,而只能使用 curl https://ip.at9.net 返回IP”。经过调查,发现这是由于CloudFlare的SSL问题导致的,目前还没有一个确切的解决方法。