フォワードプロキシ経由の通常の HTTP リクエストでは、Node はプロキシに接続し、宛先 URL をリクエスト行に載せて送ります。3 つの値がその 1 つのリクエストを説明します。

値例
TCP 接続エンドポイントproxy.example:8080
リクエストターゲットhttp://example.com/news?q=proxy
Host ヘッダーexample.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 の authority を使い、矛盾する受信 Host フィールドを置き換えます。一貫した宛先 Host ヘッダーを送ることは、送信リクエストを曖昧でないまま保ちます。Node の接続ホスト名は仲介者なので、その接続アドレスに頼らずヘッダーを意図的に設定してください。

認証が必要な場合、プロキシの資格情報はそのホップに属します。Node の auth リクエストオプションはリソース用の Authorization ヘッダーを作るものであり、汎用のプロキシログインオプションではありません。やり取りが複雑な場合は、プロキシが要求するスキームと適切なプロキシクライアントを使ってください。

HTTPS はトンネルを追加する

この例は素の HTTP 転送を扱います。典型的な HTTP プロキシ経由の HTTPS 接続 はまず CONNECT example.com:443 を要求し、受け入れられたトンネルの中で宛先への TLS を開始します。例の URL を HTTPS に変えても、これらの段階は追加されません。

HTTPS や混在したワークロードでは、必要なトンネル対応を備えた保守されたプロキシエージェントまたはディスパッチャーを使ってください。互換性のある Node バージョンでは、ProxyAgent を使った Undici の fetch が一つの選択肢です。素の HTTP のやり取りそのものを制御または理解する必要がある場合は、この小さなコアクライアントの例を残してください。

関連記事