HTTPプロキシを実装する際に、リクエスト・レスポンスヘッダをどのように扱うべきかを調査した。
接続制御(Hop-by-hop)ヘッダ
接続制御ヘッダとしては、ConnectionヘッダとConnectionヘッダフィールドに列挙されるヘッダに加えて、RFC2612では単独でHop-by-hopヘッダと定義されていた以下のヘッダも考慮する必要がある。
- Keep-Alive、Proxy-Authenticate、Proxy-Authorization、TE、Trailers、Transfer-Encoding、Upgrade
接続制御ヘッダについて、プロキシではクライアントから受け取った設定値に基づいて接続処理を行い、HTTPリクエストを転送する際はプロキシ・転送先間の設定値に書き換えて送信する必要がある。
参考
13.5.1 End-to-end and Hop-by-hop Headers - RFC 2616
- 以下をHop-by-hopヘッダ(単一のトランスポート層の接続にのみ意味を持つヘッダ)とする。
- Connection、Keep-Alive、Proxy-Authenticate、Proxy-Authorization、TE、Trailers、Transfer-Encoding、Upgrade
- その他はEnd-to-endヘッダ(最終的な宛先に転送されるヘッダ)となる。
- その他のHop-by-hopヘッダを利用する場合はConnectionヘッダに列挙しなければならない。
- Connectionヘッダ以外のヘッダを接続制御に利用する(Hop-by-hopヘッダ)場合は、送信者はヘッダ名をConnectionヘッダフィールドに列挙しなければならない。
- (RFC 2616に記述されていたHop-by-hopヘッダ一覧の記載がなくなり、Connectionヘッダ以外はConnectionヘッダフィールドでの列挙が必須となった。)
プロキシヘッダ
プロキシはHTTPリクエストを転送する際に、Viaヘッダに自分の情報を追記(ヘッダが存在しない場合は作成して)する必要がある。
転送情報を格納する任意のヘッダとしてForwardedがRFC 7239で定義されているが、多くのプロキシ実装ではこの代替として、X-Forwarded-For、X-Forwarded-Host、X-Forwarded-Protoが使われている。
参考
-
5.7.1 Via - RFC 7230
- プロキシは転送する各メッセージに適切なViaヘッダフィールドを設定しなければならない。
- 各転送者はViaヘッダフィールドに各自の情報をカンマ区切りで追加する。
- 1つの転送者の情報には受信プロトコルと受信者が含まれる。
- 例)Via: 1.0 fred, 1.1 p.example.net
-
4 Forwarded HTTP Header Field - RFC 7239
- Forwardedは任意のリクエストヘッダフィールドであり、プロキシで失われる情報を格納する。
- (ヘッダフィールドに格納する情報の種類についてはRFCでは定義されていない。)
- 各転送者はForwardedヘッダフィールドに各自の情報をカンマ区切りで追加する。
- 例)Forwarded: for=192.0.2.60;proto=http;by=203.0.113.43
- HTTPヘッダー プロキシ - MDN
キャッシュ制御ヘッダ
プロキシでHTTPレスポンスのキャッシュを保持する場合は、以下のキャッシュ制御ヘッダを処理する必要がある。
- Age、Cache-Control、Clear-Site-Data (Draft)、Expires、Pragma、Warning
参考
未知のヘッダ・その他注意事項
プロキシは未知のヘッダについて、Connectionヘッダフィールドに列挙されていない(End-to-endヘッダ)限りは転送する必要がある。
また、ヘッダフィールドに複数の値が設定されている場合は、その順番を保持する必要がある。
参考
3.2.1 Field Extensibility - RFC 7230
- プロキシは未知のヘッダについて、Connectionヘッダフィールドに列挙されている、もしくはブロック(変換)するように設定されていない限り、そのヘッダを転送しなければならない。
- プロキシはヘッダフィールドに複数の値が設定されている場合、その順番を変更して転送してはならない。