如何通过PHP程序化创建DirectAdmin子域名?选择API调用还是直接文件操作?
用PHP创建DirectAdmin子域名:API vs 直接文件操作
兄弟,我之前折腾过DirectAdmin里用PHP自动化建子域名的需求,给你梳理下最靠谱的方案和要踩的坑:
优先推荐:使用DirectAdmin API
绝对不要一开始就想着直接改服务器文件!DirectAdmin的内部配置是互相关联的,手动操作很容易漏步骤或者导致面板和服务冲突。用官方API才是正确姿势,它会帮你自动处理所有依赖环节(目录创建、DNS配置、Apache虚拟主机、面板记录同步等等)。
用PHP调用API的大致步骤:
- 准备API请求参数:你需要管理员账号的用户名、密码,目标主域名
mydomain.com,要创建的子域名前缀sub,还有服务器的DirectAdmin访问地址(比如https://your-server-ip:2222)。 - 用CURL构造POST请求,调用
CMD_API_SUBDOMAINS接口,核心参数包括:action=createdomain=mydomain.comsubdomain=sub- 可选:
dir=public_html/sub.mydomain.com(指定子域名的根目录,默认就是这个路径)
- 处理API响应:返回的文本会告诉你创建是否成功,失败的话会给出错误原因(比如子域名已存在、权限不足等)。
举个简单的PHP代码片段(记得替换成你的实际信息):
$daUrl = 'https://your-server-ip:2222/CMD_API_SUBDOMAINS'; $credentials = 'admin:your-admin-password'; $postData = http_build_query([ 'action' => 'create', 'domain' => 'mydomain.com', 'subdomain' => 'sub', 'dir' => 'public_html/sub.mydomain.com' ]); $ch = curl_init($daUrl); curl_setopt($ch, CURLOPT_USERPWD, $credentials); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 如果你没装可信SSL证书的话 $response = curl_exec($ch); curl_close($ch); // 解析响应,DirectAdmin API通常返回类似"error=0&text=Subdomain created"的格式 parse_str($response, $result); if ($result['error'] == 0) { echo "子域名创建成功!"; } else { echo "创建失败:" . $result['text']; }
万不得已才用:直接操作服务器文件(不推荐)
如果你因为某些原因必须手动操作文件,那得覆盖所有DirectAdmin涉及子域名的配置点,缺一不可:
- 创建子域名根目录:在主域名的
public_html下新建对应文件夹,比如mkdir /home/admin/domains/mydomain.com/public_html/sub.mydomain.com,还要把权限改成和主目录一致(通常是admin:admin,用chown -R admin:admin 目录路径)。 - 更新Apache虚拟主机配置:DirectAdmin不会直接让你改全局
httpd.conf,而是每个域名有单独的配置文件,路径是/usr/local/directadmin/data/users/admin/domains/mydomain.com.conf。你需要在这个文件里添加子域名的<VirtualHost>段,格式和主域名类似,把ServerName改成sub.mydomain.com,DocumentRoot指向刚才创建的目录。 - 添加DNS记录:编辑主域名的DNS数据库文件
/usr/local/directadmin/data/users/admin/domains/mydomain.com.db,添加一条A记录:sub.mydomain.com. IN A 你的服务器IP,保存后重载DNS服务(比如systemctl reload named)。 - 更新DirectAdmin的子域名列表:在
/usr/local/directadmin/data/users/admin/domains/mydomain.subdomains文件里,添加一行子域名前缀sub,这样DirectAdmin面板里才会显示这个子域名。 - 同步DirectAdmin缓存:执行命令
/usr/local/directadmin/directadmin taskq,让面板同步新的配置,避免面板显示和实际配置不一致。
手动操作的风险提醒
- 权限问题:PHP运行的用户(通常是
www-data)默认没有修改DirectAdmin配置文件的权限,你要么给PHP提权(非常危险),要么用sudo配合脚本,但这会带来安全隐患。 - 配置覆盖:如果用户之后在DirectAdmin面板里修改主域名配置,你手动添加的内容可能被面板自动生成的配置覆盖。
- 语法错误:如果Apache配置写错了,会导致整个Web服务崩溃,排查起来很麻烦。
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

