nginxでX-Accel-Redirectを使う場合に余計なヘッダを削除する

アプリケーションで認証後 S3 のコンテンツを返したかったのだけど、nginx で BASIC 認証を掛けていたらうまくいかなかった、というお話。

  • Amazon S3 の認証トークン付き URL をアプリケーションで生成し X-Accel-Redirect ヘッダに出力
  • nginx が S3 から取得してきてクライアントに返す

という動作をさせたくて、以下のように設定。

# nginx.conf
location = /reproxy {
    internal;
    set $reproxy  $upstream_http_x_reproxy_url;
    proxy_pass $reproxy;
    proxy_hide_header Content-Type;
}

アプリケーションからは以下のようなレスポンスヘッダを出力。

X-Accel-Redirect: /reproxy
X-Reproxy-URL: http://***.s3.amazonaws.com/contents?AWSAccessKeyId=***&Expires=***&Signature=***

これで nginx がレスポンスヘッダを見て、S3 から取ってきたものをクライアントに返してくれる。
しかし nginx で BASIC 認証を掛けていると、S3 のレスポンスが status 400 になってしまう、という現象。

動作はあくまで proxy なので (proxy_pass $reproxy)、クライアントから送られてきた Authorization ヘッダを S3 のほうへ送出するのが良くなかった模様。

# nginx.conf
location = /reproxy {
    internal;
    set $reproxy  $upstream_http_x_reproxy_url;
    proxy_pass $reproxy;
    proxy_hide_header Content-Type;
    proxy_set_header  Authorization "";
}

proxy_set_header で Authorization を削除してやる事で、期待通りの動作をした。