Axios не работает через прокси: 16 причин и решений

Axios в Node.js идёт мимо прокси или падает через него? 16 причин с проверенными решениями: proxy: false в 1.21, HTTP/2, CONNECT, 407, NO_PROXY, SOCKS5.

На этой странице

Если запрос Axios в Node.js идёт мимо прокси или падает по пути через него, причина — одна из 16 перечисленных ниже, и большинство из них зависит от версии Axios. Axios 1.21.0 и 1.21.1 игнорируют агент с proxyEnv, если задано proxy: false. httpVersion: 2 и адаптер fetch идут напрямую во всех версиях, где они есть. Выпуски до 1.16.1 не открывают туннель CONNECT для адреса https://. К каждой причине приложен вывод, который мы записали, и решение, которое мы запускали.

Проверено на Node.js 24.22.2 и 26.13.0 с Axios 1.12.2, 1.19.0, 1.20.0, 1.21.0 и 1.21.1, а также 1.13.6, 1.15.0, 1.16.0, 1.16.1 и 1.18.1, чтобы найти, где менялось поведение, с https-proxy-agent 9.1.0 и socks-proxy-agent 10.1.0, на macOS 26.5.1 arm64, 11 ноября 2026 года. Стенд — это прокси с журналом и HTTPS-цель на 127.0.0.1. «В обход» значит, что цель ответила, а прокси ничего не записал. Скрипты, таблица результатов и все 1290 записей лежат в папке стенда (на английском). Чтобы настроить прокси с нуля, начните с руководства Настройка прокси в Axios; эта страница — для настройки, которая ведёт себя не так.

Быстрая проверка: идёт ли запрос через прокси?

js
import axios from 'axios';

// Use the same client and options as the code you are debugging.
const res = await axios.get('https://api.ipify.org?format=json', {
  proxy: { protocol: 'http', host: 'proxy.example', port: 8080 },
});
console.log(res.data);

Запустите его с параметрами того кода, который не работает, а затем ещё раз совсем без прокси. Если оба запуска выводят один и тот же IP, запрос прошёл мимо прокси. Статус 200 ничего не доказывает: каждый обход на этой странице вернул 200. Если у вас есть доступ к журналу самого прокси, сначала посмотрите туда. На стенде каждый запрос https://, прошедший через прокси, оставлял одну строку CONNECT, а каждый запрос в обход — ни одной.

Найдите свой симптом

Что вы видитеКуда идти
Статус 200, но IP ваш собственный, а в журнале прокси пустоЗапрос идёт мимо прокси
400, socket hang up, wrong version number, ENOTFOUND undefined или запрос, который не завершаетсяHTTPS через HTTP-прокси не работает
Request failed with status code 407407 и ошибки аутентификации
HTTPS_PROXY задан, но игнорируется, или прокси пропущен для хоста, для которого не долженПеременные окружения и NO_PROXY
Первый запрос идёт через прокси, а редирект нетРедиректы уходят с прокси
protocol mismatch или SOCKS-прокси не может разрешить имя хостаПрокси SOCKS5

Запрос идёт мимо прокси, без ошибки

1. proxy: false рядом с агентом proxyEnv (Axios 1.21.0 и новее)

js
import https from 'node:https';
import axios from 'axios';

const agent = new https.Agent({ proxyEnv: { https_proxy: 'http://proxy.example:8080' } });
const res = await axios.get('https://example.com/', { proxy: false, httpsAgent: agent });
console.log(res.status);

В Axios 1.20.0 этот запрос прошёл через прокси стенда. В 1.21.0 тот же скрипт вывел:

code
200
# proxy log: (nothing)
# target log: GET /ip HTTP/1.1 direct

Начиная с 1.21.0 proxy: false означает «подключаться напрямую», даже если у агента есть собственные настройки прокси: Axios заменяет агент копией без proxyEnv (#11402, закрыта 5 ноября 2026 года; изменение внесено в PR #11242, коммит 2498c23). То же самое на стенде произошло с собственным переключателем Node: NODE_USE_ENV_PROXY=1 или --use-env-proxy вместе с proxy: false шли через прокси до 1.20.0 включительно и напрямую в 1.21.0 и 1.21.1.

Решение: уберите proxy: false из запросов, которые используют такой агент. Автор #11402 это подтвердил, а на стенде скрипт без этой опции прошёл через прокси во всех десяти версиях. Axios оставляет работу с прокси из окружения агенту, у которого есть proxyEnv (документация по настройкам запроса). Рядом со сторонним агентом, например HttpsProxyAgent, оставьте proxy: false: эта пара работала во всех версиях (причина 5).

2. httpVersion: 2

js
import axios from 'axios';

// HTTPS_PROXY=http://proxy.example:8080 is set in the environment.
const res = await axios.get('https://example.com/', { httpVersion: 2 });
console.log(res.status);

В Axios 1.21.1:

code
200
# proxy log: (nothing)
# target log: GET /ip HTTP/2.0 direct
Axiosобъект proxyHTTPS_PROXYproxy: false + HttpsProxyAgent
1.13.6, 1.15.0, 1.16.0ERR_HTTP2_ERRORERR_HTTP2_ERRORв обход без ошибки
1.16.1, 1.18.1, 1.19.0в обход без ошибкив обход без ошибкив обход без ошибки
1.20.0, 1.21.0, 1.21.1ERR_NOT_SUPPORTв обход без ошибкив обход без ошибки

В Axios 1.12.2 поддержки HTTP/2 нет, и опция была проигнорирована. Бюллетень безопасности GHSA-3pq3-5fj3-cg6v (CVE-2026-101898, запись в базе GitLab) охватывает версии от 1.13.0 до 1.20.0, не включая её: путь HTTP/2 подключается сам и отбрасывает прокси. Стенд воспроизвёл тихий обход в версиях с 1.16.1 по 1.19.0. В 1.13.6, 1.15.0 и 1.16.0 запрос падал с Protocol error, отправив прокси байты HTTP/2, то есть там сбой был заметным, а не тихим.

Исправление в 1.20.0 отклоняет явный объект proxy с сообщением HTTP/2 requests with a proxy are not supported. Окружение оно не охватывает: в PR #11141 сказано, что HTTP/2 остаётся прямым, когда прокси задан только переменными окружения или агентом, а в документации — что запросы HTTP/2 нельзя направить через прокси. NODE_USE_ENV_PROXY=1 тоже шёл напрямую.

Решение: уберите httpVersion: 2 из каждого запроса, который обязан идти через прокси. Тот же запрос без этой опции прошёл через прокси по HTTP/1.1 в 1.16.1 и новее.

3. Адаптер fetch

С adapter: 'fetch' объект proxy, HTTPS_PROXY и httpsAgent были обойдены без ошибки во всех десяти версиях и на обеих линейках Node. Документация помечает proxy как только для Node.js, и на стенде только стандартный HTTP-адаптер читал эту опцию, переменные прокси и агенты.

Решение: уберите adapter: 'fetch' или позвольте Node самому проксировать свой fetch: с NODE_USE_ENV_PROXY=1 и заданным HTTPS_PROXY адаптер fetch шёл через прокси на Node 24.22.2 и 26.13.0. proxy: false этого не отключал. Если вместо этого вы видите ошибку fetch failed, смотрите исправление fetch failed в Node.js за прокси и invalid onError method в Node.js 26.

4. Агент передан не в ту опцию

HttpsProxyAgent, переданный только как httpAgent, при адресе https://: обход без ошибки во всех версиях. Axios использует httpAgent для запросов http:// и httpsAgent для запросов https:// (README).

Решение: задайте обе опции, как в примере с SOCKS ниже.

HTTPS через HTTP-прокси не работает

5. Axios до 1.16.1 не отправляет CONNECT

С объектом proxy или HTTPS_PROXY версии Axios 1.12.2, 1.13.6, 1.15.0 и 1.16.0 не просили у прокси туннель. Прокси стенда получал весь URL в обычном запросе:

code
AxiosError: Request failed with status code 400
# exit code: 1
# proxy log: A GET https://target.test:<T>/ip -> 400
# target log: (nothing)

Наш прокси отклоняет такой запрос кодом 400. Прокси стенда, который обрывает соединение, дал socket hang up (ECONNRESET) — ошибку, описанную в #4531. Эта задача была открыта в марте 2022 года и закрыта 30 июля 2025 года при чистке, в которой авторов просили перепроверить проблему. В #3384, закрытой в июне 2022 года, описана та же схема с ошибкой рукопожатия конкретного прокси, которую мы воспроизвести не смогли.

Axios 1.16.1 это изменил: по PR #10858 Axios использует туннель CONNECT для HTTPS-целей вместо того, чтобы передавать прокси URL, заголовки и тела запросов открытым текстом. Начиная с 1.16.1 каждый из этих случаев шёл через туннель.

Решение: обновитесь до 1.16.1 или новее. Если не можете, используйте прокси-агент и отключите собственную обработку прокси в Axios. Это сработало во всех десяти версиях, включая 1.12.2:

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

const agent = new HttpsProxyAgent('http://proxy.example:8080');
const res = await axios.get('https://example.com/', {
  proxy: false, // Axios adds no proxy handling of its own
  httpsAgent: agent, // the agent opens the CONNECT tunnel
  signal: AbortSignal.timeout(15000),
});
console.log(res.status);

6. wrong version number: схема прокси неверна или не указана

code
write EPROTO <id>:error:0A00010B:SSL routines:tls_validate_record_header:wrong version number:../deps/openssl/openssl/ssl/record/methods/tlsany_meth.c:78:

Клиент говорит по TLS с портом прокси, который понимает обычный HTTP. Во всех версиях стенд получал эту ошибку от protocol: 'https' в объекте proxy, от HTTPS_PROXY=https://127.0.0.1:8080, от HTTPS_PROXY=127.0.0.1:8080 совсем без схемы и от new HttpsProxyAgent('https://…'). До 1.16.0 включительно объект proxy без protocol падал так же; с 1.16.1 он работал.

protocol и схема URL описывают соединение с прокси, а не с сайтом: указывайте https только тогда, когда сам прокси принимает TLS (README). В #6198 эта ошибка описана с HttpsProxyAgent; задачу закрыли в августе 2025 года из-за отсутствия воспроизведения, а её конфигурация с адресом прокси http:// на нашем стенде работала.

Решение: для обычного HTTP-прокси пишите protocol: 'http' или http:// в URL. Та же ошибка в других клиентах разобрана в руководстве SSL: wrong version number через прокси.

7. Прокси задан строкой, или схема попала в host

  • proxy: 'http://proxy.example:8080' (строка): getaddrinfo ENOTFOUND undefined начиная с 1.16.1, connect ECONNREFUSED ::1:443 до неё.
  • proxy: { host: 'http://proxy.example', port: 8080 }: Invalid URL (ERR_INVALID_URL) начиная с 1.16.1, getaddrinfo ENOTFOUND http://127.0.0.1 до неё.

Ни один из вариантов не дошёл до прокси. В #2072, закрытой в 2020 году, вторая форма использована в браузерном коде, где опция proxy не действует вовсе (документация); браузеры мы не проверяли.

Решение: передавайте объект с именем хоста без схемы в host, числовым или строковым port и схемой в protocol.

8. Запрос не завершается

Начиная с Axios 1.16.1, с объектом proxy или HTTPS_PROXY, прокси, который закрывал соединение после CONNECT или вообще не отвечал на него, оставлял запрос в ожидании: ни ответа, ни ошибки через 15 секунд, хотя был задан timeout: 5000. До 1.16.1 те же случаи отклонялись с socket hang up или timeout of 5000ms exceeded. С proxy: false и HttpsProxyAgent закрытое соединение приводило к ошибке Proxy connection ended before receiving CONNECT response, а молчащий прокси оставлял запрос в ожидании во всех десяти версиях. Адреса http:// отклонялись как обычно, с timeout of 5000ms exceeded или socket hang up. На 11 ноября 2026 года мы не нашли в Axios задачи об этом.

Решение: задайте каждому запросу через прокси собственный предельный срок. signal: AbortSignal.timeout(3000) завершал каждый зависший случай через 3 секунды с canceled (ERR_CANCELED). maxRedirects: 0 тоже заставлял timeout работать для встроенного туннеля — этот случай упомянут в заметках к 1.16.0.

407 и ошибки аутентификации

Неверный пароль или его отсутствие давали одно и то же во всех версиях, откуда бы ни брались учётные данные — из proxy.auth, из HTTPS_PROXY или из URL для HttpsProxyAgent: Request failed with status code 407, где error.code равен ERR_BAD_REQUEST, а error.response.status — 407. Прокси записал один запрос с ответом 407, а цель ничего не увидела. У прокси SOCKS5 кода состояния нет: неверный пароль там дал Socks5 Authentication failed.

9. Учётные данные указаны не там

Имя пользователя и пароль прокси в опции auth верхнего уровня вернули 407, и журнал прокси показывает, что учётных данных он не получил. auth верхнего уровня предназначена для сайта; учётные данные прокси указываются в proxy.auth (README). С proxy.auth начиная с 1.16.1 прокси аутентифицировал CONNECT, а цель ни разу не увидела заголовок Proxy-Authorization, в том числе при редиректе на второй хост.

10. Спецсимволы закодированы неверно

Прокси стенда ожидал пароль p@ss/w0rd#1:

Куда попадает парольКак записанРезультат
proxy.auth.passwordкак естьчерез прокси (1.16.1 и новее)
proxy.auth.passwordс процентным кодированием407: прокси получил p%40ss%2Fw0rd%231
URL в HTTPS_PROXYкак естьgetaddrinfo ENOTFOUND ss
URL в HTTPS_PROXYс процентным кодированием407: прокси получил p%40ss%2Fw0rd%231
URL для HttpsProxyAgentс процентным кодированиемчерез прокси (все версии)

Если вставить пароль как есть, символ @ обрывает учётные данные раньше времени, и хостом становится ss. С процентным кодированием URL разбирается, но Axios копирует из него имя пользователя и пароль, не декодируя их (http.js в 1.21.1). Поэтому в проверенных версиях пароль с зарезервированными символами вообще нельзя было передать через HTTPS_PROXY.

Решение: передавайте его в proxy.auth без кодирования или в URL агента с процентным кодированием. Оба запроса ниже прошли через прокси в версиях с 1.19.0 по 1.21.1:

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

const user = process.env.PROXY_USER;
const pass = process.env.PROXY_PASS;

// In the proxy object: the raw password, not percent-encoded.
const a = await axios.get('https://example.com/', {
  proxy: { protocol: 'http', host: 'proxy.example', port: 8080, auth: { username: user, password: pass } },
});

// In a proxy URL for an agent: percent-encode both parts.
const url = `http://${encodeURIComponent(user)}:${encodeURIComponent(pass)}@proxy.example:8080`;
const b = await axios.get('https://example.com/', { proxy: false, httpsAgent: new HttpsProxyAgent(url) });
console.log(a.status, b.status);

Если 407 остаётся и при верных учётных данных, например из-за списка разрешённых IP или формата имени пользователя, смотрите исправление ошибки прокси 407.

Переменные окружения не подхватываются, или NO_PROXY срабатывает неверно

Что Axios читал на стенде во всех десяти версиях: HTTPS_PROXY или https_proxy для адресов https://, HTTP_PROXY или http_proxy для адресов http://, а также ALL_PROXY или all_proxy, когда нужной переменной нет. Если заданы оба написания, побеждало строчное. Переменные читаются в момент запроса, поэтому присвоить process.env.HTTPS_PROXY в коде до запроса было достаточно. Объект proxy имел приоритет и над переменными, и над NO_PROXY. До 1.16.1 переменные читались так же, но запросы https:// после этого падали, как в причине 5.

11. Переменная не соответствует схеме URL

Когда задан только HTTP_PROXY, запрос https:// шёл напрямую без ошибки во всех версиях. Когда задан только HTTPS_PROXY, так же вёл себя запрос http://.

Решение: задайте обе, обычно с одним и тем же адресом прокси http://. В руководстве Переменные окружения для прокси сравнивается, как их читают другие клиенты.

12. Прокси из окружения перекрывает ваш агент

При заданном HTTPS_PROXY агент HttpsProxyAgent или SocksProxyAgent, переданный как httpsAgent без proxy: false, игнорировался: начиная с 1.16.1 запрос шёл через прокси из окружения, а не через прокси агента. Объект proxy рядом с агентом побеждал точно так же. Достаточно CI-раннера или контейнера, который задаёт HTTPS_PROXY, чтобы ваш трафик пошёл не через тот прокси, что указан в коде.

Решение: proxy: false в каждом запросе, который использует сторонний прокси-агент. С ним запрос шёл через прокси агента во всех десяти версиях, что бы ни было в окружении.

13. NO_PROXY сопоставляется по-разному в разных версиях

При заданной переменной прокси и хосте target.test в URL:

NO_PROXYМаршрутВерсии
target.test, TARGET.TEST, .test, *.test, *, target.test:PORT с портом из URLнапрямуювсе
other.test target.test или other.test, target.testнапрямуювсе
.target.test, test, get.test, target.test:9999, https://target.testпроксивсе
target.test, когда в URL указано target.test. с точкой на концепрокси в 1.12.2 и 1.13.6, напрямую с 1.15.0исправлено в 1.15.0
127.0.0.0/8, хост в URL 127.0.0.1прокси до 1.19.0, напрямую с 1.20.0исправлено в 1.20.0
localhost, хост в URL 127.0.0.1прокси до 1.15.0, напрямую с 1.16.0изменено в 1.16.0

Строка с точкой на конце — это GHSA-3p68-rc4w-qgx5, исправлено в 1.15.0. Строка с CIDR — это GHSA-44g4-m2mj-wpvx (CVE-2026-101899), исправлено в 1.20.0; бюллетень называет затронутыми версии 1.15.0 и новее, а на стенде 1.12.2 и 1.13.6 тоже игнорировали запись CIDR. Когда NO_PROXY не задан, запросы к localhost и 127.0.0.1 шли через прокси во всех версиях. В статье Сопоставление NO_PROXY: результаты тестов есть такая же матрица для других клиентов.

Редиректы уходят с прокси

14. Редирект меняет схему или ведёт на хост из NO_PROXY

Цель стенда отвечает 302 на второй хост.

  • С http:// на https://, задан только HTTP_PROXY: первый переход шёл через прокси, а второй напрямую, во всех версиях. То же происходило с proxy: false и заданным только httpAgent. С обоими агентами, а начиная с 1.16.1 и с обеими переменными, оба перехода шли через прокси.
  • С https:// на https:// на другом хосте: оба перехода шли через прокси с объектом proxy, с HTTPS_PROXY и с агентом, начиная с 1.16.1. При аутентификации на прокси оба запроса CONNECT несли учётные данные.
  • Редирект на хост из NO_PROXY: в 1.21.0 и 1.21.1 второй переход шёл напрямую. В версиях с 1.16.1 по 1.20.0 он всё ещё шёл через прокси. С явным объектом proxy оба перехода шли через прокси начиная с 1.16.1.

Решение: задайте обе переменные или оба агента. Если редирект никогда не должен уходить с прокси, используйте объект proxy или пару агентов с proxy: false и не вносите этот хост в NO_PROXY.

Прокси SOCKS5

15. socks5:// в опции proxy или в HTTPS_PROXY

В Axios нет клиента SOCKS. proxy: { protocol: 'socks5', … } и HTTPS_PROXY=socks5://… падали с protocol mismatch (ERR_ASSERTION) до 1.16.0 включительно. Начиная с 1.16.1 Axios отправлял на порт SOCKS строку HTTP CONNECT, SOCKS-сервер стенда закрывал соединение, и запрос не завершался (причина 8).

Решение: SOCKS-агент в обеих опциях агента и proxy: false (причина 12). Так запрос прошёл через прокси SOCKS5 стенда во всех десяти версиях:

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

// socks5h: the proxy resolves the hostname. socks5: this machine does.
const agent = new SocksProxyAgent('socks5h://proxy.example:1080');
const res = await axios.get('https://example.com/', {
  proxy: false,
  httpAgent: agent,
  httpsAgent: agent,
  signal: AbortSignal.timeout(15000),
});
console.log(res.status);

16. socks5 вместо socks5h

С socks5:// SOCKS-сервер стенда получал IP-адрес: клиент разрешил имя сам. С socks5h:// он получал имя хоста (README socks-proxy-agent). Для имени, которое может разрешить только прокси, socks5:// падал с getaddrinfo ENOTFOUND proxy-only.test, а socks5h:// работал. В статье SOCKS5 и SOCKS5h объясняется, что ещё выдаёт локальный DNS-запрос.

Заведомо рабочая настройка для каждой задачи

Все три варианта прошли через прокси стенда в Axios 1.19.0, 1.20.0, 1.21.0 и 1.21.1 на обеих линейках Node. В 1.12.2 сработал только третий.

Постоянный прокси в коде (Axios 1.16.1 или новее):

js
import axios from 'axios';

const client = axios.create({
  proxy: {
    protocol: 'http', // how to reach the proxy, not the site
    host: 'proxy.example',
    port: 8080,
    auth: { username: process.env.PROXY_USER, password: process.env.PROXY_PASS },
  },
});

const res = await client.get('https://example.com/', { signal: AbortSignal.timeout(15000) });
console.log(res.status);

Корпоративный прокси из окружения (Axios 1.16.1 или новее). Задайте переменные вне кода:

sh
export HTTPS_PROXY=http://proxy.example:8080
export HTTP_PROXY=http://proxy.example:8080
export NO_PROXY=localhost,127.0.0.1
js
import axios from 'axios';

// Started with HTTPS_PROXY, HTTP_PROXY and NO_PROXY in the environment.
// No proxy option, no agent, no httpVersion, default adapter.
const res = await axios.get('https://example.com/', { signal: AbortSignal.timeout(15000) });
console.log(res.status);

Свой прокси для каждого запроса (все проверенные версии):

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

const agents = new Map();
const agentFor = (proxyUrl) => {
  if (!agents.has(proxyUrl)) agents.set(proxyUrl, new HttpsProxyAgent(proxyUrl));
  return agents.get(proxyUrl);
};

const viaProxy = (url, proxyUrl) =>
  axios.get(url, { proxy: false, httpsAgent: agentFor(proxyUrl), signal: AbortSignal.timeout(15000) });

const first = await viaProxy('https://example.com/', 'http://proxy-a.example:8080');
const second = await viaProxy('https://example.com/', 'http://proxy-b.example:8080');
console.log(first.status, second.status);

На стенде два запроса ушли через два разных прокси. Для адресов http:// добавьте HttpProxyAgent из http-proxy-agent как httpAgent.

Страховка для ваших тестов

Большинство причин выше возвращают 200, поэтому обычный набор тестов остаётся зелёным, когда обновление или новая опция начинает обходить прокси. Этот тест запускает подставной прокси, который записывает всё, что до него дошло, и отказывает, а затем отправляет один запрос через клиент, который создаёт ваше приложение:

js
import assert from 'node:assert/strict';
import { once } from 'node:events';
import http from 'node:http';
import { test } from 'node:test';
import { createClient } from './client.mjs';

test('the HTTP client sends requests through the proxy', async () => {
  const seen = [];
  // A stand-in proxy: it records what arrives and refuses it, so nothing leaves the machine.
  const proxy = http.createServer((req, res) => {
    seen.push(`${req.method} ${req.url}`);
    res.writeHead(503).end();
  });
  proxy.on('connect', (req, socket) => {
    seen.push(`CONNECT ${req.url}`);
    socket.end('HTTP/1.1 503 Service Unavailable\r\n\r\n');
  });
  proxy.listen(0, '127.0.0.1');
  await once(proxy, 'listening');

  const client = createClient(`http://127.0.0.1:${proxy.address().port}`);
  // .invalid never resolves, so a request that skips the proxy cannot reach a real site.
  await client.get('https://guard.invalid/', { signal: AbortSignal.timeout(5000) }).catch(() => {});
  proxy.close();

  assert.deepEqual(seen, ['CONNECT guard.invalid:443']);
});

createClient(proxyUrl) — это ваша собственная фабрика. С клиентом «свой прокси для каждого запроса» из примера выше node --test прошёл во всех пяти основных версиях. После того как в тот же клиент добавили adapter: 'fetch', тест упал:

code
not ok 1 - the HTTP client sends requests through the proxy
    Expected values to be strictly deep-equal:
    + actual - expected
    + []
    - [
    -   'CONNECT guard.invalid:443'
    - ]
# tests 1
# pass 0
# fail 1
# exit code: 1

Какие версии использовать, а каких избегать

  • Используйте 1.21.1, последний выпуск на дату теста, или хотя бы 1.20.0. После обновления проверьте две вещи: proxy: false рядом с агентом proxyEnv (причина 1) и редиректы на хосты из NO_PROXY (причина 14).
  • До 1.16.1: нет туннеля CONNECT для адресов https:// через HTTP-прокси (причина 5). Используйте схему с агентом или обновитесь.
  • С 1.13.0 по 1.19.0 с httpVersion: 2: в диапазоне GHSA-3pq3-5fj3-cg6v. В 1.20.0 и новее HTTP/2 по-прежнему игнорирует HTTPS_PROXY (причина 2).
  • До 1.15.0 и до 1.20.0: NO_PROXY не учитывает соответственно хосты с точкой на конце и диапазоны CIDR (причина 13).
  • Node.js: 24.22.2 и 26.13.0 маршрутизировали все случаи одинаково. Единственное отличие: через адаптер fetch Node 26 согласовал с целью стенда HTTP/2, а Node 24 использовал HTTP/1.1.

Частые вопросы

Почему Axios игнорирует HTTPS_PROXY?

На стенде у этого было шесть причин: proxy: false в запросе, httpVersion: 2, adapter: 'fetch', объект proxy, у которого приоритет, совпадение в NO_PROXY или адрес http://, для которого читается HTTP_PROXY.

Нужен ли ещё https-proxy-agent для Axios?

Для одного HTTP-прокси в Axios 1.16.1 или новее — нет: объект proxy и HTTPS_PROXY сами открывали туннель. Он нужен в старых версиях, и это самый простой способ использовать свой прокси для каждого запроса.

Поддерживает ли Axios прокси SOCKS5?

Через proxy или HTTPS_PROXY — нет. Передайте SocksProxyAgent как httpAgent и httpsAgent вместе с proxy: false.

Почему запрос Axios зависает через прокси, хотя задан timeout?

В проверенных версиях timeout не охватывал прокси, который не отвечает на CONNECT (причина 8). Добавьте signal: AbortSignal.timeout(ms).

Работает ли опция proxy в Axios в браузере?

Нет. Документация помечает proxy как опцию только для Node.js; браузер использует прокси операционной системы или собственный.

Связанные руководства

Проверьте исправление через настоящий IP. ipvolt продаёт резидентные прокси от $2.20 за ГБ и выделенный мобильный прокси от $9 в день. Подставьте прокси в настройку выше и запустите быструю проверку. Проверить прокси сейчас.

Источники и дополнительное чтение

Технические материалы, использованные при подготовке руководства. Сверяйтесь с документацией вашей версии и с поддерживаемой конфигурацией вашего провайдера.