Nginx反向代理VoIP电话Web端的auth_basic认证透传及配置问题
配置冗余项清理建议
root、index指令可以直接删除:当前server块全量走反向代理逻辑,不会加载本地静态文件,这两个配置完全不会生效,保留无意义。server_name _是Nginx默认的兜底匹配规则,如果你这台服务器的443端口仅部署这一个服务,可直接保留;如果有多个域名对应不同服务,修改为你实际绑定的访问域名即可。
认证透传解决方案
问题根因
- 你生成的
admin:22222的Base64编码错误:当前使用的YWRtaW46MjIyMjIK是输入字符串带换行的编码结果,正确无换行的编码应为YWRtaW46MjIyMjI=,后端无法识别错误编码的认证头,因此返回401要求认证。 - 客户端输入的Nginx层Basic认证的
Authorization头会默认转发到后端,覆盖你手动设置的认证头,导致后端收到的是Nginx层的认证信息,验证失败。 - 后端验证失败返回401时携带的
WWW-Authenticate头会被Nginx转发到浏览器,触发浏览器再次弹出认证框,形成死循环。
修复后的完整配置
server { listen 443 default_server ssl; server_name _; # 证书配置保留即可 ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem; ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key; ssl_protocols TLSv1.2; # 前端仅启用TLS1.2,符合安全要求 # Nginx层认证配置 auth_basic "VoIP phone"; auth_basic_user_file /etc/nginx/.htpasswd; location / { # 明确指定和后端通信使用SSL3.0,避免协议协商失败 proxy_ssl_protocols SSLv3; # 先清空客户端传来的Authorization头,避免覆盖后端认证信息 proxy_set_header Authorization ""; # 填入正确的后端账号Base64编码 proxy_set_header Authorization "Basic YWRtaW46MjIyMjI="; # 隐藏后端返回的认证头,避免浏览器弹出二次认证框 proxy_hide_header WWW-Authenticate; # 原有代理配置保留 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-Proto https; proxy_redirect off; proxy_pass https://192.168.100.51; proxy_http_version 1.1; } }
验证步骤
配置修改后执行nginx -t检查语法无误,再执行nginx -s reload重载配置,访问时仅需要输入你设置在.htpasswd里的新账号密码即可直接进入管理页面,不需要再输入后端的默认账号。
内容的提问来源于stack exchange,提问作者Matthai
相关产品推荐
相关产品推荐

