Node の HTTP をプロキシ経由で振り向けるリクエスト行
接続先エンドポイント、絶対ターゲット、Host ヘッダーを分離し、Node のコアクライアントで素の HTTP プロキシリクエストを組み立てます。
フォワードプロキシ経由の通常の 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 のやり取りそのものを制御または理解する必要がある場合は、この小さなコアクライアントの例を残してください。