在用 Nginx 做反向代理时,“继承”源服务器(后端)的 BasicAuth 认证,本质上是:把客户端发送的 Authorization 头完整转发给后端。
默认情况下,Nginx 是会转发这个头的,但在一些配置(比如自定义 header、鉴权、rewrite 等)下可能会丢失或被覆盖,所以你需要显式确保它被传递。
✅ 一、最核心配置(转发 Authorization 头)
在你的 location 或 server 配置中加上:
location / {
proxy_pass http://backend;
proxy_set_header Authorization $http_authorization;
}
👉 关键点:
-
$http_authorization= 客户端请求里的Authorization头(包含 BasicAuth 的 base64 信息) -
这一行确保认证信息不会丢失
✅ 二、完整推荐配置(更稳)
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 关键:转发认证头
proxy_set_header Authorization $http_authorization;
}
🚨 三、常见导致“认证失效”的坑
1️⃣ Nginx 自己开启了 BasicAuth
如果你写了:
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
👉 那就变成:
-
客户端先通过 Nginx 认证
-
后端认证可能完全收不到
✔ 解决:
-
要么只用后端认证(推荐)
-
要么明确设计“双层认证”
2️⃣ Authorization 头被清空或覆盖
例如你写了:
proxy_set_header Authorization "";
👉 这会直接导致后端无法识别用户
3️⃣ 使用了某些模块(如 fastcgi、uwsgi)
如果不是 proxy_pass,而是:
-
fastcgi_pass -
uwsgi_pass
👉 需要用对应变量:
fastcgi_param HTTP_AUTHORIZATION $http_authorization;
4️⃣ 跨域 / HTTPS 场景
如果你是:
-
HTTPS → HTTP
-
或跨域请求
👉 有些客户端不会自动发送 Authorization,需要注意:
-
浏览器 fetch 要加:
credentials: "include" -
或手动设置 header
🧠 四、验证是否成功
你可以在后端服务器检查:
方法1:看日志
比如 Apache / Nginx backend log 是否有认证信息
方法2:临时打印 header
例如在后端用:
echo $HTTP_AUTHORIZATION
🔥 五、使用IP+端口时
-
在防火墙处查看端口是否开放。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
