Apache 如何配置 Basic Auth 实现目录访问密码保护

文章导读
给特定目录加密码保护,最稳妥的做法是用 Apache 自带的 Basic Auth 配合 htpasswd 生成密码文件,适合后台管理目录或临时限制访问的场景,配置改完必须重启服务或确保.htaccess 生效。
📋 目录
  1. 安装 htpasswd 工具
  2. 生成密码文件
  3. 配置 Apache 认证
  4. 安全增强:强制 HTTPS
  5. 验证与排查
  6. 常见坑
A A

给特定目录加密码保护,最稳妥的做法是用 Apache 自带的 Basic Auth 配合 htpasswd 生成密码文件,适合后台管理目录或临时限制访问的场景,配置改完必须重启服务或确保.htaccess 生效。

先说结论:Basic Auth 配置简单且兼容性好,但密码明文传输,必须配合 HTTPS 使用,严禁在生产环境 HTTP 下单独使用。

  • 适合:后台管理入口、临时维护页、非敏感资源的简单访问控制。
  • 先准备:确认 Apache 版本、安装 httpd-tools/apache2-utils、规划密码文件存放位置(不要在 Web 目录)。
  • 验收:浏览器访问触发弹窗、输错密码拒绝访问、日志无报错。

安装 htpasswd 工具

多数最小化安装的 Apache 不包含 htpasswd 工具,需手动安装依赖包:

  • CentOS/RHEL:
    yum install httpd-tools -y
  • Ubuntu/Debian:
    apt install apache2-utils -y
  • macOS:
    brew install httpd
  • Windows:XAMPP/WAMP 集成环境通常在 apache\bin 目录下;独立安装需确保该目录已加入系统环境变量 PATH,否则命令需写绝对路径。

生成密码文件

首次创建加 -c,后续添加用户去掉 -c。密码文件必须放在 Web 根目录之外:

htpasswd -c /etc/httpd/.htpasswd username

关键步骤:设置文件权限,防止 Apache 无法读取或被其他用户篡改:

chmod 640 /etc/httpd/.htpasswd
chown root:apache /etc/httpd/.htpasswd

注:用户组可能是 www-datadaemon,根据实际 Apache 运行用户调整。

Apache 如何配置 Basic Auth 实现目录访问密码保护

配置 Apache 认证

配置文件核心片段(放在 httpd.conf、虚拟主机配置或.htaccess):

<Directory "/var/www/html/secret">
    AuthType Basic
    AuthName "Restricted Area"
    AuthUserFile /etc/httpd/.htpasswd
    Require valid-user
</Directory>

如果要用.htaccess,需确保主配置中该目录的 AllowOverride 设为 All 或 AuthConfig。

安全增强:强制 HTTPS

Basic Auth 密码 base64 编码后传输,HTTP 下等同于明文。务必启用 SSL 模块并配置跳转:

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / https://example.com/
</VirtualHost>

确保已加载 mod_ssl 并在 443 端口配置有效的证书。

Apache 如何配置 Basic Auth 实现目录访问密码保护

验证与排查

1. 浏览器验证:访问受保护目录,应弹出认证对话框。输入正确账号密码可进入,输错则返回 401 Unauthorized。

2. 命令行验证:使用 curl 测试认证头:

curl -u username:password -I http://your-domain/secret/

返回 200 OK 表示成功,401 表示认证失败。

3. 日志检查:检查 Apache 错误日志(通常位于 logs/error_log/var/log/httpd/error_log),确认没有 Permission deniedFile not found 报错。

常见坑

1. AllowOverride 未开启:使用.htaccess 时,如果主配置是 AllowOverride None,.htaccess 里的认证指令会被忽略。
2. 路径错误:AuthUserFile 必须写绝对路径,相对路径可能导致找不到密码文件。
3. 权限不足:Apache 运行用户无权读取.htpasswd 文件,需检查 chown/chmod 设置。
4. SELinux 限制:CentOS 开启 SELinux 时,可能需要恢复上下文:restorecon -R /etc/httpd/.htpasswd
5. 缓存问题:浏览器可能缓存认证信息,测试时尝试无痕模式或清除缓存。