使用 ngx_http_auth_basic_module 为静态资源目录添加基础认证,只需在 location 块中配置 auth_basic 和 auth_basic_user_file 指令,配合正确路径的密码文件与权限设置即可生效。

使用 ngx_http_auth_basic_module 为特定静态资源目录添加基础认证,只需在对应 location 块中启用 auth_basic 并指定用户凭据文件即可,无需额外模块或复杂配置。
启用基础认证并限定作用范围
该模块默认编译进大多数 Nginx 官方发行版(可通过 nginx -V 2>&1 | grep -o with-http-auth-basic-module 确认)。关键在于将认证指令精准绑定到目标静态路径,避免影响其他接口或页面:
- 用
location ^~ /protected/匹配以/protected/开头的 URI,优先级高于正则匹配,适合静态资源目录 - 在该
location内设置auth_basic "Restricted Area";,引号内为浏览器弹窗显示的提示文字 - 搭配
auth_basic_user_file /etc/nginx/.htpasswd;指向密码文件(路径需 Nginx 进程有读取权限)
生成兼容的密码文件
Nginx 不支持 Apache .htpasswd 的所有哈希格式,推荐使用 crypt()(默认)或 bcrypt(需 Nginx ≥ 1.19.5 且编译时启用 --with-http_auth_request_module 或系统支持):
- 快速生成单用户(crypt):
printf "user:$(openssl passwd -crypt 'mypass')\n" > /etc/nginx/.htpasswd - 如需更强安全性且环境支持 bcrypt:
printf "user:$(openssl passwd -apr1 'mypass')\n" > /etc/nginx/.htpasswd(-apr1对应 MD5,Nginx 也支持;-5为 SHA-256,-6为 SHA-512,需确认版本兼容性) - 多用户追加时用
>>,避免覆盖;文件需确保仅 Nginx worker 进程可读(如chmod 640 /etc/nginx/.htpasswd && chown root:www-data /etc/nginx/.htpasswd)
配合静态资源服务优化体验
认证生效后,所有对该目录的请求(包括图片、CSS、JS)都会触发验证。为减少重复弹窗和提升缓存友好性:
- 在同 location 中显式声明
root /var/www/static;或alias /var/www/static/protected/;,确保路径映射准确(注意alias末尾斜杠与location路径的匹配关系) - 添加
expires 1h;和add_header Cache-Control "public, immutable";(适用于不常更新的资源),浏览器在有效期内不会重复发送认证头 - 若资源需被前端 JS 加载(如 AJAX 请求图片),确保客户端在请求头中携带
Authorization: Basic base64(user:pass),否则会因 401 被拦截
调试与常见问题
认证失败时返回 401,但错误原因不易直接暴露。排查可聚焦三点:
- 检查 Nginx 错误日志(
error_log /var/log/nginx/error.log debug;临时开启 debug 级别),确认是否报user not found或password mismatch - 验证密码文件路径是否拼写正确,SELinux/AppArmor 是否阻止访问(如 CentOS 启用 SELinux 时需运行
setsebool -P httpd_read_user_content 1) - 浏览器可能缓存了错误凭据,测试时用无痕窗口,或清除当前域的 HTTP 认证缓存(Chrome 地址栏输入
chrome://settings/clearBrowserData→ 勾选“密码和表单数据”)











