Отключите аутентификацию для метода 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;
}
3 ответа
Вот решение, которое я придумал. Тем не менее, он дублирует все директивы 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;
}
Я нашел более чистое решение, которое позволяет узлу управлять запросом:
Поместите следующую конфигурацию в "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;
}
}
Следуя информации в Limit_Exception/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
.