Skip to content

如何优雅地使用 Axios 配置代理 —— 实战与坑点总结

在日常开发中,Axios 是我们最常用的 HTTP 客户端之一。不管你是在写 Node.js 后端脚本,还是前端爬虫工具,有时候我们都需要通过代理去访问一些资源(比如科学上网、突破 IP 限制等)。

今天我们就聊聊:Axios 如何配置代理,以及你可能会踩的那些坑。


1. 为什么需要代理?

举个例子,你的程序要访问一个国外的网站,而这个网站在国内是无法访问的。怎么办?加代理!

再比如,有些网站会根据 IP 限制访问频率,或者只允许某个国家的用户访问。这时候,如果你有一个代理 IP,那就是你的“分身”——轻松绕过限制。


2. Axios 的代理配置方法

Axios 本身是支持代理的,官方文档也有说明。但不同的运行环境(Node.js vs 浏览器)处理方式是不一样的,我们逐一来看:


在 Node.js 中使用 HTTP/HTTPS 代理

这其实是最常见的用法,尤其是你在写 CLI 工具、爬虫、Telegram 机器人等等。

ts
import axios from 'axios';
import { HttpsProxyAgent } from 'https-proxy-agent';

const proxyAgent = new HttpsProxyAgent('http://127.0.0.1:7890'); // 替换成你的代理地址

const res = await axios.get('https://example.com', {
  httpsAgent: proxyAgent,
  proxy: false, // 一定要禁用 axios 自己的 proxy,不然会冲突!
});

console.log(res.data);

小贴士:proxy: false 是重点!否则 axios 会优先使用自己的 proxy 参数(后面会讲它的问题),导致 httpsAgent 不生效。

axios 自带的 proxy 参数不好用?

你可能看到过这样的写法:

ts
axios.get('https://example.com', {
  proxy: {
    host: '127.0.0.1',
    port: 7890,
  },
});

看起来很清爽对吧?但问题是:

  • 只支持 HTTP 协议的代理
  • 不支持 HTTPS 或 SOCKS
  • 有时候在某些 Node.js 版本下会不生效;
  • 它其实是基于老旧的 http-proxy-agent 实现的,灵活性差。

所以,不推荐这种写法


正确做法:配合代理库(推荐)

https-proxy-agentsocks-proxy-agent 这样的库,灵活又靠谱。

ts
import axios from 'axios';
import { SocksProxyAgent } from 'socks-proxy-agent';

const agent = new SocksProxyAgent('socks5h://127.0.0.1:1080');

const res = await axios.get('https://google.com', {
  httpsAgent: agent,
  proxy: false,
});
  • 支持 SOCKS5 / HTTPS / HTTP
  • 支持认证(用户名密码)
  • 与 axios 配合良好

3. 浏览器端能用代理吗?

不能,至少不是你想象的那种方式。

在浏览器里运行的 Axios 请求,走的是用户本地的网络环境,无法通过代码控制代理设置。如果你在浏览器开发者工具里设置了代理,是全局生效的,不是 Axios 的事。

所以,浏览器端想走代理,只能靠系统/浏览器插件的配置,或者后端转发。


4. 坑点总结

  • proxy: { host, port } 只支持 HTTP,别用它搞 HTTPS/SOCKS;
  • httpsAgent 更稳定;
  • 不加 proxy: false 会导致代理无效;
  • 记得区分 httpAgenthttpsAgent,请求协议要匹配;
  • 浏览器端无法用 Axios 设置代理,别挣扎了;

5. 一个完整的代理请求封装

ts
import axios, { AxiosRequestConfig } from 'axios';
import { HttpsProxyAgent } from 'https-proxy-agent';

const useProxyRequest = async (url: string, config?: AxiosRequestConfig) => {
  const proxy = process.env.PROXY || 'http://127.0.0.1:7890';
  const agent = new HttpsProxyAgent(proxy);

  return axios.get(url, {
    ...config,
    httpsAgent: agent,
    proxy: false,
  });
};

6. 最后总结

  • 如果你是在 Node.js 中使用 Axios,请使用 https-proxy-agent 这类库;
  • 避免使用 Axios 自带的 proxy 参数;
  • 浏览器端无法设置代理,靠服务端中转或浏览器配置;
  • 配置代理时记得加 proxy: false