HTTP基本认证跨域失败主因是CORS机制与认证头协同规则被忽略,需排查预检请求是否通过、凭证是否透传、响应头是否合规,并确保Nginx正确配置Access-Control-Allow-Credentials、放行Authorization头且避免双重鉴权冲突。

HTTP 基本认证(Basic Auth)在跨域场景下失败,往往不是认证本身出错,而是浏览器的 CORS 机制与认证头协同规则被忽略所致。问题常表现为:带 Authorization: Basic xxx 的请求触发预检(OPTIONS),但预检响应缺失必要头,或后端/代理层拒绝了带凭证的跨域请求。排查需聚焦“预检是否通过”“凭证是否被透传”“响应头是否合规”三个关键环节。
确认是否触发了预检请求(OPTIONS)
只要请求携带 Authorization 头,浏览器一定会先发 OPTIONS 预检。这是硬性规则,无法绕过。
- 打开浏览器开发者工具 → Network 标签页 → 刷新页面或重发请求
- 查找类型为 OPTIONS 的请求,看它是否成功(状态码 2xx)
- 若 OPTIONS 返回 401、403 或直接超时/无响应,说明预检卡在 Nginx 或后端之前;若返回 204/200 但没带 CORS 头,问题在响应头配置
检查 Nginx 是否允许带凭证的跨域请求
启用 Basic Auth 意味着请求含凭证(credentials),此时 Access-Control-Allow-Origin 不能为 *,必须指定明确来源;同时必须显式开启 Access-Control-Allow-Credentials。
- 确保 location 块中配置了具体域名(如
https://your-frontend.com),而非通配符 - 必须添加:
add_header 'Access-Control-Allow-Credentials' 'true'; - 注意:
add_header不继承,该指令必须写在处理业务请求和 OPTIONS 请求的同一 location 内
验证 Nginx 是否正确透传 Authorization 头并响应预检
Nginx 默认会过滤掉部分敏感头(包括 Authorization),若用 proxy_pass 转发,需主动放行;同时要能正确响应 OPTIONS 请求(尤其当后端不处理 OPTIONS 时)。
- 在 proxy 相关 location 中添加:
proxy_pass_request_headers on;(默认为 on,但显式声明更稳妥) - 补全预检响应头,例如:
proxy_pass http://backend;
proxy_set_header Authorization $http_authorization;
proxy_pass_request_headers on;
if ($request_method = 'OPTIONS') {
add_header Access-Control-Allow-Origin 'https://your-frontend.com';
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization';
add_header Access-Control-Allow-Credentials 'true';
add_header Access-Control-Max-Age 86400;
add_header Content-Length 0;
add_header Content-Type 'text/plain; charset=utf-8';
return 204;
}
}
- 特别注意:
Access-Control-Allow-Headers必须包含Authorization,否则浏览器判定预检失败
排除 Nginx 自身 Basic Auth 与后端认证的冲突
如果 Nginx 层也配置了 auth_basic(比如用 htpasswd 保护接口路径),而前端又向同一路径发带 Authorization 的请求,就会出现双重鉴权干扰——Nginx 先拦下校验,失败则直接返回 401,根本不会转发给后端。
- 检查是否有类似
auth_basic "Restricted"; auth_basic_user_file /etc/nginx/.htpasswd;的配置出现在对应 location 中 - 若后端已负责认证,应移除 Nginx 层的 Basic Auth 配置,避免叠加拦截
- 若必须保留 Nginx 层认证,需确保前端发送的 Base64 凭证同时满足 Nginx 和后端两套规则(极不推荐)











