nginxのadd_headerでレスポンスヘッダが付かない時の対処法

nginxでクロスドメインのBASIC認証を設定した際にAccess-Control-Allow-Originなどのレスポンスヘッダを付ける必要があり、add_headerで設定したのですが、ヘッダが付かずに苦戦したので原因と対処法を書いておきます。

原因:nginxのadd_headerは特定のHTTPステータスコードでしか有効にならない

nginxのadd_headerはHTTPステータスコードが200, 201, 204, 206, 301, 302, 303, 304 or 307の場合にしかレスポンスヘッダを付けてくれない仕様でした。

BASIC認証設定を行うとステータスコードが401でレスポンスされるため、これにadd_headerでCORS用のヘッダを付けても有効にならないことが原因でした。

以下は、NGのnginx設定例です

# CORS用のヘッダ(ステータスコード401のため無効となる)
add_header 'Access-Control-Allow-Methods' 'GET,OPTIONS,PUT,DELETE';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Headers' 'Authorization,User-Agent,Keep-Alive,Content-Type,accept,origin';
add_header 'Access-Control-Allow-Origin' 'https://myhost.com';
# プリフライト対策
if ($request_method = 'OPTIONS') {
  return 200;
}
# BASIC認証設定
auth_basic "test";
auth_basic_user_file .htpasswd;

対策:add_headerにalwaysオプションを付ける

add_headerにalwaysオプションがあり、これを付けるとステータスコードによらずヘッダを付けることができ、これで解消しました。

# CORS用のヘッダ(alwaysオプションを追加)
add_header 'Access-Control-Allow-Methods' 'GET,OPTIONS,PUT,DELETE' always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
add_header 'Access-Control-Allow-Headers' 'Authorization,User-Agent,Keep-Alive,Content-Type,accept,origin' always;
add_header 'Access-Control-Allow-Origin' 'https://myhost.com' always;
# プリフライト対策
if ($request_method = 'OPTIONS') {
  return 200;
}
# BASIC認証設定
auth_basic "test";
auth_basic_user_file .htpasswd;

まとめてみるとすごく単純な話でしたが、なかなか情報がなくて苦労しました・・・

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です