У звичайному HTTP-запиті через прямий проксі Node підключається до проксі й надсилає URL призначення в рядку запиту. Три значення описують цей один запит:

ЗначенняПриклад
Кінцева точка TCP-з'єднанняproxy.example:8080
Ціль запитуhttp://example.com/news?q=proxy
Заголовок Hostexample.com

Цей приклад для Node 22 робить розділення очевидним:

const http = require('node:http');
const destination = new URL('http://example.com/news?q=proxy');

const request = http.get({
  hostname: 'proxy.example',
  port: 8080,
  path: destination.href,
  headers: { Host: destination.host },
  signal: AbortSignal.timeout(15000),
}, (response) => {
  console.log(response.statusCode);
  response.on('error', console.error);
  response.resume();
});
request.on('error', console.error);

Кінцева точка — заповнювач; виберіть кандидата зі списку HTTP-проксі для публічного HTTP-тесту й перевірте його відповідь. Приклад вичитує відповідь після виведення статусу; застосунок може натомість використати тіло. Запит залишається частиною цілі запиту.

Чому повний URL належить саме туди

Сервер-джерело зазвичай отримує ціль на кшталт /news?q=proxy. Прямому проксі теж потрібне призначення, тому HTTP/1.1 визначає ціль в абсолютній формі:

GET http://example.com/news?q=proxy HTTP/1.1
Host: example.com

За правилами HTTP/1.1 проксі, що отримав абсолютну форму, під час пересилання використовує повноваження URI й замінює неузгоджене отримане поле Host. Надсилання узгодженого заголовка Host призначення все одно робить вихідний запит однозначним. Ім'я хоста з'єднання в Node — це посередник, тому задавайте заголовок свідомо, а не покладайтеся на цю адресу з'єднання.

Якщо потрібна автентифікація, облікові дані проксі належать його переходу. Параметр запиту auth у Node створює заголовок Authorization для ресурсу; це не загальний параметр входу через проксі. Використовуйте схему, яку вимагає проксі, і відповідний клієнт проксі, коли обмін складніший.

HTTPS додає тунель

Цей приклад охоплює звичайне пересилання HTTP. Типове HTTPS-з'єднання через HTTP-проксі спершу запитує CONNECT example.com:443, а потім запускає TLS до призначення всередині прийнятого тунелю. Зміна URL прикладу на HTTPS не додає цих етапів.

Для HTTPS або змішаного навантаження використовуйте підтримуваний проксі-агент або диспетчер із потрібною підтримкою тунелів. Для сумісних версій Node один із варіантів — fetch з Undici та ProxyAgent. Збережіть цей невеликий приклад базового клієнта для випадків, коли саме звичайний обмін HTTP потрібно контролювати або розуміти.

Схожі статті