NGINX反代时BasicAuth认证

在用 Nginx 做反向代理时,“继承”源服务器(后端)的 BasicAuth 认证,本质上是:把客户端发送的 Authorization 头完整转发给后端

默认情况下,Nginx 是会转发这个头的,但在一些配置(比如自定义 header、鉴权、rewrite 等)下可能会丢失或被覆盖,所以你需要显式确保它被传递。


✅ 一、最核心配置(转发 Authorization 头)

在你的 locationserver 配置中加上:

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
喜欢就支持一下吧
点赞8 分享