Node.js实现cURL --resolve等价请求,解决axios方案返回404问题
解决方案
核心原理
curl --resolve 的本质是强制将指定域名+端口的DNS解析指向自定义IP,同时保持请求头的Host字段为原域名,你之前返回404大概率是修改请求地址为IP后,没有正确设置Host头,导致服务端虚拟主机无法匹配到对应站点。
方案1:原生Node.js http模块实现
const http = require('http'); const options = { // 自定义解析的目标IP host: '127.0.0.1', port: 80, path: '/', // 必须保留原域名作为Host头,否则服务端无法识别站点 headers: { 'Host': 'www.example.com' } }; http.get(options, (res) => { console.log(`响应状态码: ${res.statusCode}`); res.on('data', (chunk) => { console.log(chunk.toString()); }); }).on('error', (e) => { console.error(`请求出错: ${e.message}`); });
方案2:Axios实现(适配你当前的技术选型)
const axios = require('axios'); // https请求需要额外引入https模块 // const https = require('https'); async function customResolveRequest() { try { const res = await axios.get('http://127.0.0.1', { headers: { 'Host': 'www.example.com' }, // 如果是HTTPS请求,要加以下配置避免证书校验报错(证书是颁发给原域名的) // httpsAgent: new https.Agent({ // checkServerIdentity: (host, cert) => { // if (cert.subject.CN === 'www.example.com') return undefined; // return new Error('证书与目标域名不匹配'); // } // }) }); console.log('响应内容:', res.data); } catch (err) { console.error('请求出错:', err.response?.status || err.message); } } customResolveRequest();
方案3:全局自定义DNS解析(适合多请求批量配置场景)
如果有大量请求都需要自定义解析规则,可以直接覆盖DNS lookup逻辑,不用逐个修改请求配置:
const dns = require('dns'); const http = require('http'); // 自定义DNS解析规则 const customLookup = (hostname, options, callback) => { if (hostname === 'www.example.com') { // 匹配到目标域名直接返回自定义IP,4代表IPv4 return callback(null, '127.0.0.1', 4); } // 其他域名走系统默认DNS解析 return dns.lookup(hostname, options, callback); }; // 请求时直接写原域名即可,不需要修改请求地址和Host头 http.get('http://www.example.com', { lookup: customLookup }, (res) => { console.log('响应状态码:', res.statusCode); res.pipe(process.stdout); });
内容的提问来源于stack exchange,提问作者Anish Gupta
相关产品推荐
相关产品推荐

