宝塔面板批量建站需模拟表单提交至/site?action=AddSite接口,禁用已受限的add_site API;须携带有效request_token和cookie,domain逗号分隔且主域名置首,site_path以/www/wwwroot/开头并chown -R www:www授权。

宝塔面板里批量添加站点时,add_site API 不可用,得用脚本模拟表单提交
宝塔官方没有开放「批量建站」的 Web UI 入口,后台 API 里的 add_site 接口在较新版本(如 v8.0+)中已被限制或移除权限,直接调用会返回 {"code":401,"msg":"无权限访问"}。真实可行的方式是复用宝塔前端提交逻辑,用 Python 或 Shell 拼装表单数据 POST 到 /site?action=AddSite。
实操建议:
- 先手动建一个测试站点,用浏览器开发者工具抓包,记录
domain、path、php_version、type等字段名和值格式 - 注意
domain是逗号分隔字符串(如"a.com,b.com,www.a.com"),不是数组 - POST 请求必须携带有效的
request_token和cookie,否则 403;token 可从/config/get_request_token获取 - 目录路径必须以
/www/wwwroot/开头,且末尾不带斜杠,例如/www/wwwroot/myapp
用 Shell 脚本循环调用 curl 批量创建站点时,必须控制并发与重试
一次性发 50 个请求大概率触发宝塔的请求频率拦截,表现为返回空响应或 502 Bad Gateway。不能靠单纯加 sleep 1 解决,要结合状态码判断 + 指数退避。
关键点:
立即学习“PHP免费学习笔记(深入)”;
- 每次请求后检查响应是否含
"code":0,否则记录失败域名并重试(最多 3 次) - 使用
curl -s -w "%{http_code}"捕获状态码,避免依赖 JSON 解析失败导致误判 - 失败后 sleep 时间按 1s → 2s → 4s 递增,防止雪崩
- 不要在循环内重复获取
request_token,它 10 分钟有效,取一次复用即可
绑定多个域名时,domain 字段顺序影响 HTTPS 自动申请
宝塔的 Let's Encrypt 插件默认只对 domain 字段中「第一个域名」申请证书。如果填成 "www.example.com,example.com",证书主体是 www.example.com,example.com 只作为 SAN 存在;但若顺序反过来,主域名变成 example.com,部分老旧客户端可能不认其通配符兼容性。
稳妥做法:
- 主站域名放最前(如企业官网主域),其余子域、别名跟在后面
- 避免把测试域名(如
test.example.com)放在第一位,否则正式证书可能被错误签发到测试域 - 如果需泛域名证书,必须单独配置,不能靠多域名字段实现;
domain字段不支持*.example.com写法
site_path 目录权限与 PHP 运行用户不匹配会导致 500 错误
批量建站脚本常忽略目录属主问题:宝塔默认用 www 用户跑 PHP,但脚本新建的目录往往属主是 root,导致 PHP 进程无法读取 index.php,Nginx 日志报 Permission denied。
必须补一步授权:
- 建站后立即执行
chown -R www:www /www/wwwroot/your_site - 如果站点启用了防跨站(open_basedir),还要确认
/www/wwwroot/your_site在白名单内,否则即使权限对也会报错 - 不建议用
chmod 777临时解决——宝塔的www用户默认不在www-data组,组权限无效











