宝塔「访问限制」基于Nginx/Apache的HTTP Basic Auth实现,仅拦截HTTP请求、不涉及PHP逻辑;路径须严格匹配(区分大小写、尾部斜杠影响子路径匹配)、明文存密、禁与禁止访问共存、CDN需关闭401缓存。

网站目录加密码,本质是启用 HTTP Basic Auth
宝塔的「访问限制」功能底层用的是 Nginx 或 Apache 的基础认证模块,不是自己写的登录页。这意味着:它只对 HTTP 请求做拦截,不涉及 PHP、数据库或前端逻辑;所有被保护的路径(比如 /admin 或 /backup)都会在浏览器弹出原生认证框,输入正确账号密码才放行。
实操建议:
- 必须先确保目标站点已启用 Nginx 或 Apache —— 如果用的是 OpenLiteSpeed 或其他 Web 服务,该功能不可用
- 加密路径不能以斜杠结尾(如
/zixun/可用,但/zixun在某些 Nginx 版本下会失效) - 账号密码明文存于站点配置文件中(路径类似
/www/server/panel/vhost/nginx/xxx.conf),别用弱口令 - 如果同时开了 CDN,且 CDN 缓存了 401 响应,访客可能一直卡在“请输入用户名和密码”——需在 CDN 后台关闭对该路径的缓存
添加访问限制时,路径填写要严格匹配 URL 结构
填错路径是最常见的失败原因。比如你填了 /wp-admin,但用户实际访问的是 https://site.com/wp-admin/(带尾部斜杠),Nginx 默认不自动匹配,就会跳过验证直接放行。
实操建议:
- 路径区分大小写,
/Admin≠/admin - 若想保护整个子目录及其所有子路径,务必在路径末尾加斜杠,例如:
/private/(有效),/private(仅匹配该文件名,不包含/private/file.php) - 支持多级嵌套,如
/api/v2/、/data/logs/,但每条规则只生效一次,不能通配多个不相关路径 - 若需保护单个 PHP 文件(如
config.php),路径应写成/config.php,注意开头的斜杠不能省
禁止访问和密码访问不能共存于同一路径
在同一个路径上,宝塔不允许同时开启「禁止访问」和「加密访问」。后台会静默忽略后设置的一项,但界面不提示,容易误以为生效了。
实操建议:
- 「禁止访问」是返回 403,彻底拒绝一切请求(包括你自己);「加密访问」是返回 401,允许凭据通过
- 如果误操作导致路径完全打不开,去
/www/server/panel/vhost/nginx/找对应站点的 conf 文件,删掉含auth_basic和deny all的 block 即可恢复 - 测试时务必用无痕窗口或清除浏览器认证缓存 —— 浏览器会记住上次成功输入的凭据,即使改了密码也不弹框
密码生效后,PHP 脚本里拿不到原始认证头
因为 Nginx/Apache 在验证通过后,会剥离 Authorization 请求头再转发给 PHP,所以你在 $_SERVER['HTTP_AUTHORIZATION'] 或 getallheaders() 里是取不到的。这不是 Bug,是标准行为。
实操建议:
- 不要指望用 PHP 再做一层校验——它根本收不到原始凭据
- 如需在 PHP 中识别当前访问者身份,只能靠 session 或 cookie 配合前端登录态,和这里的 HTTP Basic Auth 无关
- 调试时可用
curl -v -u user:pass https://yoursite.com/private/看响应头是否含WWW-Authenticate,确认 Nginx 层是否介入










