如何通过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
相关产品推荐
相关产品推荐

