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

Source: https://ipvolt.com/ru/guides/fix-axios-proxy-not-working
Markdown: https://ipvolt.com/ru/guides/fix-axios-proxy-not-working.md
Language: ru

[ipvolt — главная](https://ipvolt.com/ru.md) / [Руководства](https://ipvolt.com/ru/guides.md) / Axios не работает через прокси: 16 причин и решений

Диагностика
Опубликовано: 2026-11-11
15 мин чтения
Автор: ipvolt

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. «В обход» значит, что цель ответила, а прокси ничего не записал. Скрипты, [таблица результатов](/downloads/fix-axios-proxy-not-working/RESULTS.md) и все 1290 записей лежат в [папке стенда](/downloads/fix-axios-proxy-not-working/README.md) (на английском). Чтобы настроить прокси с нуля, начните с руководства [Настройка прокси в Axios](/ru/guides/axios-proxy-setup); эта страница — для настройки, которая ведёт себя не так.

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

```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-прокси не работает](#https-через-http-прокси-не-работает) |
| `Request failed with status code 407` | [407 и ошибки аутентификации](#407-и-ошибки-аутентификации) |
| `HTTPS_PROXY` задан, но игнорируется, или прокси пропущен для хоста, для которого не должен | [Переменные окружения и NO_PROXY](#переменные-окружения-не-подхватываются-или-noproxy-срабатывает-неверно) |
| Первый запрос идёт через прокси, а редирект нет | [Редиректы уходят с прокси](#редиректы-уходят-с-прокси) |
| `protocol mismatch` или SOCKS-прокси не может разрешить имя хоста | [Прокси SOCKS5](#прокси-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 тот же скрипт вывел:

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

Начиная с 1.21.0 `proxy: false` означает «подключаться напрямую», даже если у агента есть собственные настройки прокси: Axios заменяет агент копией без `proxyEnv` ([#11402](https://github.com/axios/axios/issues/11402), закрыта 5 ноября 2026 года; изменение внесено в [PR #11242](https://github.com/axios/axios/pull/11242), коммит [2498c23](https://github.com/axios/axios/commit/2498c233438eb72c9a9ee8540ded19c6ef4224fa)). То же самое на стенде произошло с собственным переключателем 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` ([документация по настройкам запроса](https://axios.rest/pages/advanced/request-config)). Рядом со сторонним агентом, например `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:

```text
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](https://github.com/axios/axios/security/advisories/GHSA-3pq3-5fj3-cg6v) (CVE-2026-101898, [запись в базе GitLab](https://advisories.gitlab.com/npm/axios/CVE-2026-101898/)) охватывает версии от 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](https://github.com/axios/axios/pull/11141) сказано, что HTTP/2 остаётся прямым, когда прокси задан только переменными окружения или агентом, а в [документации](https://axios.rest/pages/advanced/request-config) — что запросы 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](https://axios.rest/pages/advanced/request-config), и на стенде только стандартный HTTP-адаптер читал эту опцию, переменные прокси и агенты.

**Решение:** уберите `adapter: 'fetch'` или позвольте Node самому проксировать свой `fetch`: с [`NODE_USE_ENV_PROXY=1`](https://nodejs.org/api/cli.html#node_use_env_proxy1) и заданным `HTTPS_PROXY` адаптер fetch шёл через прокси на Node 24.22.2 и 26.13.0. `proxy: false` этого не отключал. Если вместо этого вы видите ошибку `fetch failed`, смотрите [исправление fetch failed в Node.js за прокси](/ru/guides/fix-node-fetch-failed-proxy) и [invalid onError method в Node.js 26](/ru/guides/node-26-invalid-onerror-method).

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

`HttpsProxyAgent`, переданный только как `httpAgent`, при адресе `https://`: обход без ошибки во всех версиях. Axios использует `httpAgent` для запросов `http://` и `httpsAgent` для запросов `https://` ([README](https://github.com/axios/axios/blob/v1.21.1/README.md#request-config)).

**Решение:** задайте обе опции, как в примере с 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 в обычном запросе:

```text
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](https://github.com/axios/axios/issues/4531). Эта задача была открыта в марте 2022 года и закрыта 30 июля 2025 года при чистке, в которой авторов просили перепроверить проблему. В [#3384](https://github.com/axios/axios/issues/3384), закрытой в июне 2022 года, описана та же схема с ошибкой рукопожатия конкретного прокси, которую мы воспроизвести не смогли.

[Axios 1.16.1](https://github.com/axios/axios/releases/tag/v1.16.1) это изменил: по [PR #10858](https://github.com/axios/axios/pull/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: схема прокси неверна или не указана

```text
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](https://github.com/axios/axios/blob/v1.21.1/README.md#request-config)). В [#6198](https://github.com/axios/axios/issues/6198) эта ошибка описана с `HttpsProxyAgent`; задачу закрыли в августе 2025 года из-за отсутствия воспроизведения, а её конфигурация с адресом прокси `http://` на нашем стенде работала.

**Решение:** для обычного HTTP-прокси пишите `protocol: 'http'` или `http://` в URL. Та же ошибка в других клиентах разобрана в руководстве [SSL: wrong version number через прокси](/ru/guides/fix-ssl-wrong-version-number-proxy).

### 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](https://github.com/axios/axios/issues/2072), закрытой в 2020 году, вторая форма использована в браузерном коде, где опция `proxy` не действует вовсе ([документация](https://axios.rest/pages/advanced/request-config)); браузеры мы не проверяли.

**Решение:** передавайте объект с именем хоста без схемы в `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](https://github.com/axios/axios/releases/tag/v1.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](https://github.com/axios/axios/blob/v1.21.1/README.md#request-config)). С `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://github.com/axios/axios/blob/v1.21.1/lib/adapters/http.js)). Поэтому в проверенных версиях пароль с зарезервированными символами вообще нельзя было передать через `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](/ru/guides/fix-proxy-error-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://`. В руководстве [Переменные окружения для прокси](/ru/guides/proxy-environment-variables) сравнивается, как их читают другие клиенты.

### 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](https://github.com/axios/axios/security/advisories/GHSA-3p68-rc4w-qgx5), исправлено в 1.15.0. Строка с CIDR — это [GHSA-44g4-m2mj-wpvx](https://github.com/axios/axios/security/advisories/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: результаты тестов](/ru/blog/no-proxy-matching-tested) есть такая же матрица для других клиентов.

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

### 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](https://github.com/TooTallNate/proxy-agents/tree/main/packages/socks-proxy-agent)). Для имени, которое может разрешить только прокси, `socks5://` падал с `getaddrinfo ENOTFOUND proxy-only.test`, а `socks5h://` работал. В статье [SOCKS5 и SOCKS5h](/ru/blog/socks5-vs-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'`, тест упал:

```text
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](/ru/guides/axios-proxy-setup) — страница о настройке: одна явная проверка прокси и то, какой уровень отвечает за маршрут.
- [Переменные окружения для прокси](/ru/guides/proxy-environment-variables) сравнивает, как их читают curl, Requests и Node.
- [Исправление ошибки прокси 407](/ru/guides/fix-proxy-error-407) разбирает 407, не связанный с кодированием.
- [fetch failed: invalid onError method в Node.js 26](/ru/guides/node-26-invalid-onerror-method) — сбой прокси-агентов undici в Node 26.
- [Исправление TypeError: fetch failed в Node.js за прокси](/ru/guides/fix-node-fetch-failed-proxy) читает цепочку ошибок, когда вы используете `fetch`.
- [Сопоставление NO_PROXY: результаты тестов](/ru/blog/no-proxy-matching-tested) содержит правила сопоставления в других клиентах.

**Проверьте исправление через настоящий IP.** ipvolt продаёт [резидентные прокси](/residential-proxies) от $2.20 за ГБ и выделенный [мобильный прокси](/mobile-proxies) от $9 в день. Подставьте прокси в настройку выше и запустите быструю проверку. [Проверить прокси сейчас](/tools/proxy-checker).

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

- [axios/axios#11402: axios@1.21.0 breaks custom https.Agent with proxyEnv enabled](https://github.com/axios/axios/issues/11402)
- [axios/axios#11242: align request handling across runtimes (direct agents for proxy: false)](https://github.com/axios/axios/pull/11242)
- [axios/axios commit 2498c23](https://github.com/axios/axios/commit/2498c233438eb72c9a9ee8540ded19c6ef4224fa)
- [GHSA-3pq3-5fj3-cg6v (CVE-2026-101898): HTTP/2 adapter bypasses configured DNS lookup and proxy controls](https://github.com/axios/axios/security/advisories/GHSA-3pq3-5fj3-cg6v)
- [GitLab advisory database: CVE-2026-101898](https://advisories.gitlab.com/npm/axios/CVE-2026-101898/)
- [axios/axios#11141: HTTP/2 proxy handling and CIDR matching for NO_PROXY](https://github.com/axios/axios/pull/11141)
- [GHSA-3p68-rc4w-qgx5: NO_PROXY hostname normalization bypass](https://github.com/axios/axios/security/advisories/GHSA-3p68-rc4w-qgx5)
- [GHSA-44g4-m2mj-wpvx (CVE-2026-101899): CIDR-form NO_PROXY entries are ignored](https://github.com/axios/axios/security/advisories/GHSA-44g4-m2mj-wpvx)
- [axios/axios#4531: Proxy support does not work properly with CONNECT on https requests](https://github.com/axios/axios/issues/4531)
- [axios/axios#3384: HTTPS over HTTP Proxy Fails](https://github.com/axios/axios/issues/3384)
- [axios/axios#2072: Axios proxy is not working](https://github.com/axios/axios/issues/2072)
- [axios/axios#6198: https proxy agent not working as expected](https://github.com/axios/axios/issues/6198)
- [axios/axios#10858: CONNECT tunnelling for HTTPS targets](https://github.com/axios/axios/pull/10858)
- [Axios 1.16.0 release notes](https://github.com/axios/axios/releases/tag/v1.16.0)
- [Axios 1.16.1 release notes](https://github.com/axios/axios/releases/tag/v1.16.1)
- [Axios 1.20.0 release notes](https://github.com/axios/axios/releases/tag/v1.20.0)
- [Axios 1.21.0 release notes](https://github.com/axios/axios/releases/tag/v1.21.0)
- [Axios 1.21.1 release notes](https://github.com/axios/axios/releases/tag/v1.21.1)
- [Axios docs: request config (proxy, httpAgent, httpsAgent, environment variables)](https://axios.rest/pages/advanced/request-config)
- [Axios 1.21.1 README: request config](https://github.com/axios/axios/blob/v1.21.1/README.md#request-config)
- [Axios 1.21.1: HTTP adapter source](https://github.com/axios/axios/blob/v1.21.1/lib/adapters/http.js)
- [Node.js HTTP: built-in proxy support and the Agent proxyEnv option](https://nodejs.org/api/http.html#built-in-proxy-support)
- [Node.js CLI: NODE_USE_ENV_PROXY=1](https://nodejs.org/api/cli.html#node_use_env_proxy1)
- [Node.js CLI: --use-env-proxy](https://nodejs.org/api/cli.html#--use-env-proxy)
- [socks-proxy-agent README](https://github.com/TooTallNate/proxy-agents/tree/main/packages/socks-proxy-agent)

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

- [Настройка прокси в Axios: маршрутизация, аутентификация и NO_PROXY](https://ipvolt.com/ru/guides/axios-proxy-setup.md)
- [Переменные окружения прокси: HTTP_PROXY и NO_PROXY](https://ipvolt.com/ru/guides/proxy-environment-variables.md)
- [Как исправить ошибку прокси 407, не гадая](https://ipvolt.com/ru/guides/fix-proxy-error-407.md)

## Об ipvolt

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

[Читать оригинал на английском](https://ipvolt.com/guides/fix-axios-proxy-not-working.md)

## Подключите свой первый прокси.

Мобильные — от $9 в день. Резидентные — от $2.20 за ГБ.

[Купить мобильный прокси](https://ipvolt.com/dashboard/mobile)

[Купить резидентные прокси](https://ipvolt.com/dashboard/residential)

