宝塔「访问限制」功能最省事且安全,适合保护整路径如/admin/;需注意末尾斜杠、无痕测试;手动nginx配置支持前缀匹配与自定义提示;cdn缓存401、路径大小写、.htaccess权限等细节易致失效。

用宝塔「访问限制」功能快速加锁目录
这是最省事、也最不容易出错的方式,适合保护 /admin、/backup、/zixun/ 这类整条路径下的所有资源。它直接调用 Nginx 的 auth_basic 模块,不碰 PHP、不改代码,浏览器会弹原生认证框。
- 进【网站】→ 点目标站点【设置】→ 左侧选【访问限制】
- 在「加密访问」区域点【添加】,填入带开头斜杠的路径,比如
/private/(注意末尾斜杠!不加就只匹配文件名,不保护子路径) - 用户名和密码随便填,宝塔自动处理加密,不用自己跑
htpasswd - 提交后立刻生效,但测试时务必用无痕窗口——浏览器会缓存凭据,改了密码也不弹框
这个方式不支持正则或通配符,也不能对多个不同路径复用同一套账号;但它能自动适配当前 Web 服务类型(Nginx/Apache),且配置错误不会导致站点崩掉。
手动写 Nginx 配置实现精细控制
当你需要保护某个特定前缀(如 /api/v2/)、想自定义提示文字(比如显示“运维后台”而不是默认的“Restricted Area”),或者要和其它 location 规则共存时,就得直接改配置文件。
- 进【网站】→【设置】→【配置文件】,在
server块里插入独立的location块,例如:location ^~ /internal/ {<br> auth_basic "运维后台";<br> auth_basic_user_file /www/wwwroot/example.com/.htpasswd;<br>} -
^~表示前缀匹配且优先级高于正则,比location /internal/更稳妥 - 用宝塔终端执行:
htpasswd -c /www/wwwroot/example.com/.htpasswd admin创建用户;若文件已存在,去掉-c参数追加用户 - 确保
.htpasswd权限是644,且路径可被 Nginx worker 进程读取(一般没问题,但挂载 NFS 或 SELinux 开启时可能报Permission denied)
改完必须点【重载配置】,不是保存就行;如果漏了这步,新规则永远不生效。
路径大小写、尾部斜杠、CDN 缓存全是坑
看似简单的一行 auth_basic,实际运行中卡住人的地方几乎都跟路径细节有关。
-
/Admin和/admin完全不同,Nginx 区分大小写,输错就绕过验证 -
/private只匹配该路径本身,/private/file.txt不受保护;必须写成/private/才覆盖全部子路径 - 如果开了 CDN(比如 Cloudflare、腾讯云 CDN),它可能把 401 响应缓存下来,导致用户一直卡在弹窗——得去 CDN 后台关掉对应路径的缓存,或加 Cache-Control 头
- 不能和「禁止访问」同时启用同一个路径,宝塔会拒绝保存,因为两者底层冲突:一个返回 401(允许认证),一个返回 403(彻底拒绝)
这些都不是 Bug,而是 HTTP 协议和 Nginx 路由机制本身的特性,靠试错很难定位,得从原理上理解匹配逻辑。
Apache 下用 .htaccess 是备选,但有条件
如果你用的是 Apache(非默认选项),又没权限进宝塔改配置,只有一份 FTP,那可以用 .htaccess 文件临时补救。
- 在目标目录放
.htaccess,内容至少包含:AuthType Basic<br>AuthName "Private"<br>AuthUserFile /www/wwwroot/example.com/.htpasswd<br>Require valid-user
- 必须确认 Apache 配置中该站点的
AllowOverride包含AuthConfig,否则整段被忽略,毫无效果 -
.htpasswd文件需手动生成并上传,格式为user:$apr1$xxx...,不能用明文 - 该方式每次请求都要读文件,高并发下略拖慢,且不如 Nginx 配置稳定
现在绝大多数宝塔用户跑的是 Nginx,所以除非环境受限,否则别优先选这条路。
真正麻烦的从来不是加一行 auth_basic,而是路径怎么写才不漏、CDN 怎么调才不缓存 401、浏览器为什么死活不弹框——这些细节藏在 HTTP 协议和服务器行为里,改完记得清缓存、开无痕、查响应头。











