Nginx で HTTP OPTIONS メソッド (プリフライト リクエスト) の認証を無効にする

Nginx で HTTP OPTIONS メソッド (プリフライト リクエスト) の認証を無効にする

私の問題は、ここで説明されているものとまったく同じです:HTTP OPTIONS メソッド (プリフライト リクエスト) の認証を無効にするCORS と HTTP パスワードを同時に使用しようとしています。ブラウザがバウンスされた OPTIONS (ステータス コード 401) を検出すると、何らかの理由で、CORS ヘッダー (存在しない) がすぐにチェックされ、リクエストが拒否されます。

私の設定は次のとおりです:

location /api/ {
    proxy_pass http://127.0.0.1:14000;
    proxy_set_header Host $host;
    add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS";
    add_header Access-Control-Allow-Origin $http_origin;
    add_header Access-Control-Allow-Headers "Authorization, Content-Type";
    add_header Access-Control-Allow-Credentials true;
    auth_basic            "Restricted Area";
    auth_basic_user_file  /var/www/admin.htpasswd;
}

答え1

これが私が思いついた解決策です。ただし、CORS add_header ディレクティブをすべて重複させる問題は解決します。

location /api/ {
    proxy_pass http://127.0.0.1:14000;
    proxy_set_header Host $host;
    add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS";
    add_header Access-Control-Allow-Origin $http_origin;
    add_header Access-Control-Allow-Headers "Authorization, Content-Type";
    add_header Access-Control-Allow-Credentials true;
    if ($request_method = OPTIONS) {
        add_header Content-Length 0;
        add_header Content-Type text/plain;
        add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS";
        add_header Access-Control-Allow-Origin $http_origin;
        add_header Access-Control-Allow-Headers "Authorization, Content-Type";
        add_header Access-Control-Allow-Credentials true;
        return 200;
    }
    auth_basic            "Restricted Area";
    auth_basic_user_file  /var/www/admin.htpasswd;
}

答え2

ノードがリクエストを管理できる、よりクリーンなソリューションを見つけました。

次の設定を「location」内に配置し、サーバーから auth_basic を削除します。これで動作します。

  location / {
    # Your node proxy configuration for example #

    # Make options requests work #
    limit_except OPTIONS {
      auth_basic "Restricted access zone";
      auth_basic_user_file /etc/nginx/pass/protected;
    }
  }

答え3

以下の情報をご覧くださいlimit_except/if ブロックの問題、以下を使用することをお勧めしますmap:

map $request_method $auth_basic_value {
    default "Restricted";
    "OPTIONS" "off";
}


location / {
        auth_basic $auth_basic_value;
}

try_filesその場所にクエリを別の場所に書き換える可能性があるものがある場合は、 も設定する必要があることに注意してくださいauth_basic $auth_basic_value

関連情報