アプリケーションで認証後 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 を削除してやる事で、期待通りの動作をした。