我的问题与此处描述的完全相同:禁用 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
。