Отключить аутентификацию для метода HTTP OPTIONS (предварительный запрос) в Nginx

Отключить аутентификацию для метода HTTP OPTIONS (предварительный запрос) в Nginx

Моя проблема точно такая же, как описано здесь:Отключить аутентификацию для метода 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.

Связанный контент