自从写 JavaScript 之后越来越觉得它真的很好玩。异步,Promise,回调函数。各种各样的神奇姿势~
最近,两个月前开始的,中间鸽了很久。博客也没更很久了打算以社团的名义折腾一个 RSS 的网站放到学校的服务器里。网站的其中一个部分是用RSSHub , 请求外部网站生成 RSS 订阅源。学校的服务器要通过 Http Proxy 才能访问外网。RSSHub 用的是 axios。支持 Promise 兼容浏览器 XMLHttpRequest 和 node 的 http 请求。还有拦截器等各种操作,很爽。但是 http proxy 就出问题了。
axios 中的 HTTP Proxy
axios 本身支持 http proxy
proxy: {
host: '127.0.0.1',
port: 9000,
auth: {
username: 'mikeymike',
password: 'rapunz3l'
}
本来是很简单很舒服。但是访问 https 网站是就会出现类似这样的东西
Error: write EPROTO 140736379442112:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:../deps/openssl/openssl/ssl/s23_clnt.c:794
解决问题
node 不行,但是服务器命令行中用curl
访问 https 网站没有问题。
Google 后发现是 axios 的问题,而且已经有修复了 Pre-release (v0.19.0-beta.1)
然而,安了新版之后问题并没有解决,反而多了很多的 501 错误
网络世界那么大,我果然不是第一个遇到问题的人。用axios-https-proxy-fix问题就解决了。
看了一下源代码改动发现用了 HttpsProxyAgent 包的实例 agent 替换了 config 里面的 httpAgent。config 就是 axios 做第二个参数的对象。
这个包没更新到最新的 axios,强迫症的我受不了。于是就模仿这个思路放在了 axios 的拦截器中。
const axios = require("axios");
const tunnel = require("tunnel");
const agent = tunnel.httpsOverHttp({ proxy: config.proxy });
axios.interceptors.request.use(function (config) {
if (config.url.indexOf("https") !== -1) {
config.httpsAgent = agent;
config.proxy = false;
}
return config;
});
tunnel
和HttpsProxyAgent
用法一样但是不用自己手动构造 url。这样就可以满足我追更新的强迫症了。
本文链接: https://www.fengkx.top/post/fix-https-over-http-proxy-in-axios/
发布于: 2018-10-31