Node.js Request库访问HTTP站点代理返回407错误求助
问题分析与解决
核心问题在于request库处理HTTP和HTTPS请求的代理认证逻辑存在差异,你同时通过proxyUrl传递代理认证信息,又手动在headers里添加Proxy-Authorization头,两者在HTTP请求场景下发生了冲突,导致代理服务器未正确识别你的认证信息。
解决方案
直接移除headers中的Proxy-Authorization字段,仅保留proxyUrl的认证配置即可。因为request库会自动从proxyUrl中提取认证信息,并为HTTP请求生成正确的Proxy-Authorization头,手动添加反而会干扰这个过程。
修改后的代码:
const request = require('request').defaults({ timeout: 30000, gzip: true, forever: true }); const cookieJar = request.jar(); const proxyUrl = "http://proxyUsername:proxyPassword@proxyDomain:proxyPort"; request({ method: "GET", url: "http://mylink.com", proxy: proxyUrl, jar: cookieJar, headers: { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8", "Connection": "keep-alive", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36", }, followAllRedirects: true }, (err, resp, body) => { if (err || resp.statusCode != 200) { if (err) { console.log(err); } else { console.log(resp.statusCode); console.log(resp.body); } return; } console.log(resp.body); });
补充说明
- 为什么HTTPS请求没问题?因为HTTPS请求通过
CONNECT隧道与代理通信,request库会优先使用proxyUrl中的认证信息完成隧道建立,手动添加的Proxy-Authorization头不会干扰这个流程。 - 如果修改后仍有问题,可以尝试显式配置
proxyAuth字段替代proxyUrl中的认证:request({ // ...其他配置 proxy: "http://proxyDomain:proxyPort", proxyAuth: "proxyUsername:proxyPassword", // ...其他配置 })
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

