You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过URL向特定IP发起Ajax调用?基于Electron+NPM的域名绑定IP可达性检测技术咨询

强制Ajax请求使用指定IP访问绑定域名的站点的解决方案

我正在编写一款脚本,用于查询域名对应的IP地址,随后遍历每个IP以检测其可达性。例如,查询google.com会返回6个IP地址,我希望访问google.com时强制使用每个IP地址,从而得到6组不同的检测结果。目前我已完成大部分功能,但不清楚如何正确运用这些IP地址:若直接指定IP地址发起请求会失败,原因是服务器不会响应IP地址的请求(站点已绑定至域名)。我当前使用npm与Electron进行开发,现有代码如下:

function checkConnection(myIP, myPort, myDomain) { 
  var isAccessible = null; 
  var url = "https://" + myDomain + ":" + myPort; 
  console.log(myDomain + " check at "+ url); 
  $.ajax({ 
    url: url, 
    type: "get", 
    cache: false, 
    dataType: 'text', 
    timeout : 1500, 
    complete : function(xhr, responseText, thrownError) { 
      if(xhr.status != "404") { 
        isAccessible = true; 
        console.log(myDomain + " check at "+ url + " passed"); 
        console.log(xhr); 
        return true; 
      } else { 
        isAccessible = false; 
        console.log(myDomain + " check at "+ url + " failed"); 
        console.log(xhr); 
        return false; 
      } 
    } 
  }); 
}

嘿,这个问题的核心很明确——你需要用指定的IP发起请求,但让服务器以为你是在访问绑定的域名。直接请求IP时,HTTP请求头里的Host字段会是这个IP,而服务器只对绑定的域名响应,所以才会失败。

因为你用的是Electron,它允许我们直接使用Node.js的API,这就好办了——我们可以用Node自带的https模块来发送请求,完全控制请求头,手动设置Host为目标域名,同时指定要访问的IP。

下面是修改后的checkConnection函数,用Node的https模块实现:

const https = require('https');

function checkConnection(myIP, myPort, myDomain) {
  return new Promise((resolve, reject) => {
    const options = {
      hostname: myIP, // 这里指定要访问的目标IP
      port: myPort,
      path: '/', // 可根据实际需求修改请求路径
      method: 'GET',
      headers: {
        'Host': myDomain // 关键:把Host头设置为绑定的域名
      },
      timeout: 1500 // 保持你原来的超时时间
    };

    console.log(`${myDomain} check at https://${myIP}:${myPort} (Host: ${myDomain})`);

    const req = https.request(options, (res) => {
      console.log(`${myDomain} check at https://${myIP}:${myPort} - Status: ${res.statusCode}`);
      // 这里可以根据你的需求调整判断逻辑,比如排除5xx错误等
      if (res.statusCode !== 404) {
        resolve(true);
      } else {
        resolve(false);
      }
      // 消耗响应数据,避免内存泄漏
      res.resume();
    });

    req.on('error', (e) => {
      console.error(`${myDomain} check at https://${myIP}:${myPort} failed: ${e.message}`);
      resolve(false); // 连接错误标记为不可达
    });

    req.on('timeout', () => {
      console.log(`${myDomain} check at https://${myIP}:${myPort} timed out`);
      req.destroy();
      resolve(false);
    });

    req.end();
  });
}

关键细节说明:

  • hostname设为指定IP:直接请求目标IP地址,绕过系统默认的DNS解析
  • headers.Host设为目标域名:让服务器识别这是对绑定域名的请求,从而返回正确响应
  • 用Promise封装:原来的jQuery Ajax是异步回调模式,Promise更方便后续批量遍历检测(比如用Promise.all处理多个IP的检测任务)
  • 完善异常处理:覆盖了连接错误、超时的场景,让检测结果更准确

你可以这样调用这个函数:

// 示例:检测google.com的某个IP地址
checkConnection('142.250.185.142', 443, 'google.com')
  .then(isAccessible => {
    console.log(`检测结果:${isAccessible ? '可达' : '不可达'}`);
  });

这样就能实现你要的效果:遍历每个查到的IP,强制用该IP发起请求,同时让服务器识别对应的域名,从而得到准确的可达性检测结果。


内容的提问来源于stack exchange,提问作者Steven A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 08:27:43