HAProxyでHTTPヘッダーを操作する。(レスポンス編)

前回の続き(id:shimula:20101020)で、今回はレスポンスをHAProxyで操作してみます。

rspadd

HTTPレスポンスヘッダーを追加します。

設定例:"X-Resp-Greeding"ヘッダーを追加します。

listen web1
       bind :8080
       mode http
       server web1 192.0.2.1:80 check rise 1 fall 3
       rspadd X-Resp-Greeding:\ Hello

http://192.0.2.1:8080/にアクセスした時のレスポンスヘッダーは、以下の結果となりました。最後に"X-Resp-Greeding"ヘッダーが追加されていることを確認できました。

HTTP/1.1 304 Not Modified
Date: Sat, 13 Nov 2010 11:39:44 GMT
Server: Apache/2.2.3 (CentOS)
Connection: close
Etag: "102a3-d-48da19b900280"
X-Resp-Greeding: Hello

rspdel, rspidel

指定した正規表現にマッチするHTTPレスポンスヘッダーを削除します。
rspidelは大文字小文字を無視します。(ignore case)

設定例:"Server"ヘッダーを削除します。

listen web1
       bind :8080
       mode http
       server web1 192.0.2.1:80 check rise 1 fall 3
       rspidel ^server:

http://192.0.2.1:8080/にアクセスした時のレスポンスヘッダーは、以下の結果となりました。"Server"ヘッダーがないことが確認できました。

HTTP/1.1 304 Not Modified
Date: Sat, 13 Nov 2010 12:12:00 GMT
Connection: close
Etag: "102a3-d-48da19b900280"

rspdeny, rspideny

ステータスライン、レスポンスヘッダーに指定した正規表現がマッチする場合、レスポンスをブロックします。(ステータスコード502を返却します)
ドキュメントでは機密情報流出防止に使うのが目的だそうです。

設定例:excelファイルはダウンロードさせない。

listen web1
       bind :8080
       mode http
       server web1 192.0.2.1:80 check rise 1 fall 3
       rspideny ^Content-Type:\ .*ms-excel

http://192.0.2.1:8080/test.xlsにアクセスした時に以下のメッセージが表示されました。

502 Bad Gateway
The server returned an invalid or incomplete response. 

このサンプル設定だとレスポンスヘッダーに"Content-Type"が正しく設定されてる場合にのみに有効なので、ステータスコード304を返却した場合は当然ながらダウンロードできてしまいます。完全に制御するのであれば組み合わせで工夫しないといけないのかもしれません。

rsprep, rspirep

ステータスライン、レスポンスヘッダー内で指定した文字列がマッチする部分を置換します。
rspirep は大文字小文字を無視します。
ドキュメントではLocationヘッダーの書き換えをするのが主な用途と書いてあります。

設定例:リダイレクト先をすべて"http://example.com/"に設定する。

listen web1
       bind :8080
       mode http
       server web1 192.0.2.1:80 check rise 1 fall 3
       rsprep ^Location:\ .*  Location:\ http://example.com/

リダイレクトをさせるようなURLを実行すると"http://example.com/"にリダイレクトします。