avatar

fengkx's Blog

fengkx

Student & Coder

Guangzhou, China
Build with Hexo and Next.js

axios https 走 http proxy 的坑

自从写 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)
axios pre-release
然而,安了新版之后问题并没有解决,反而多了很多的 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;
});

tunnelHttpsProxyAgent用法一样但是不用自己手动构造 url。这样就可以满足我追更新的强迫症了。

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处。

本文链接: https://www.fengkx.top/post/fix-https-over-http-proxy-in-axios/

发布于: 2018-10-31