Если запрос 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; эта страница — для настройки, которая ведёт себя не так.
Быстрая проверка: идёт ли запрос через прокси?
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 407 | 407 и ошибки аутентификации |
HTTPS_PROXY задан, но игнорируется, или прокси пропущен для хоста, для которого не должен | Переменные окружения и NO_PROXY |
| Первый запрос идёт через прокси, а редирект нет | Редиректы уходят с прокси |
protocol mismatch или SOCKS-прокси не может разрешить имя хоста | Прокси SOCKS5 |
Запрос идёт мимо прокси, без ошибки
1. proxy: false рядом с агентом proxyEnv (Axios 1.21.0 и новее)
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 тот же скрипт вывел:
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
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:
200
# proxy log: (nothing)
# target log: GET /ip HTTP/2.0 direct| Axios | объект proxy | HTTPS_PROXY | proxy: false + HttpsProxyAgent |
|---|---|---|---|
| 1.13.6, 1.15.0, 1.16.0 | ERR_HTTP2_ERROR | ERR_HTTP2_ERROR | в обход без ошибки |
| 1.16.1, 1.18.1, 1.19.0 | в обход без ошибки | в обход без ошибки | в обход без ошибки |
| 1.20.0, 1.21.0, 1.21.1 | ERR_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 в обычном запросе:
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:
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: схема прокси неверна или не указана
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:
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 стенда во всех десяти версиях:
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 или новее):
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 или новее). Задайте переменные вне кода:
export HTTPS_PROXY=http://proxy.example:8080
export HTTP_PROXY=http://proxy.example:8080
export NO_PROXY=localhost,127.0.0.1import 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);Свой прокси для каждого запроса (все проверенные версии):
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, поэтому обычный набор тестов остаётся зелёным, когда обновление или новая опция начинает обходить прокси. Этот тест запускает подставной прокси, который записывает всё, что до него дошло, и отказывает, а затем отправляет один запрос через клиент, который создаёт ваше приложение:
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', тест упал:
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; браузер использует прокси операционной системы или собственный.
Связанные руководства
- Настройка прокси в Axios — страница о настройке: одна явная проверка прокси и то, какой уровень отвечает за маршрут.
- Переменные окружения для прокси сравнивает, как их читают curl, Requests и Node.
- Исправление ошибки прокси 407 разбирает 407, не связанный с кодированием.
- fetch failed: invalid onError method в Node.js 26 — сбой прокси-агентов undici в Node 26.
- Исправление TypeError: fetch failed в Node.js за прокси читает цепочку ошибок, когда вы используете
fetch. - Сопоставление NO_PROXY: результаты тестов содержит правила сопоставления в других клиентах.
Проверьте исправление через настоящий IP. ipvolt продаёт резидентные прокси от $2.20 за ГБ и выделенный мобильный прокси от $9 в день. Подставьте прокси в настройку выше и запустите быструю проверку. Проверить прокси сейчас.
Источники и дополнительное чтение
Технические материалы, использованные при подготовке руководства. Сверяйтесь с документацией вашей версии и с поддерживаемой конфигурацией вашего провайдера.
- axios/axios#11402: axios@1.21.0 breaks custom https.Agent with proxyEnv enabled
- axios/axios#11242: align request handling across runtimes (direct agents for proxy: false)
- axios/axios commit 2498c23
- GHSA-3pq3-5fj3-cg6v (CVE-2026-101898): HTTP/2 adapter bypasses configured DNS lookup and proxy controls
- GitLab advisory database: CVE-2026-101898
- axios/axios#11141: HTTP/2 proxy handling and CIDR matching for NO_PROXY
- GHSA-3p68-rc4w-qgx5: NO_PROXY hostname normalization bypass
- GHSA-44g4-m2mj-wpvx (CVE-2026-101899): CIDR-form NO_PROXY entries are ignored
- axios/axios#4531: Proxy support does not work properly with CONNECT on https requests
- axios/axios#3384: HTTPS over HTTP Proxy Fails
- axios/axios#2072: Axios proxy is not working
- axios/axios#6198: https proxy agent not working as expected
- axios/axios#10858: CONNECT tunnelling for HTTPS targets
- Axios 1.16.0 release notes
- Axios 1.16.1 release notes
- Axios 1.20.0 release notes
- Axios 1.21.0 release notes
- Axios 1.21.1 release notes
- Axios docs: request config (proxy, httpAgent, httpsAgent, environment variables)
- Axios 1.21.1 README: request config
- Axios 1.21.1: HTTP adapter source
- Node.js HTTP: built-in proxy support and the Agent proxyEnv option
- Node.js CLI: NODE_USE_ENV_PROXY=1
- Node.js CLI: --use-env-proxy
- socks-proxy-agent README