如何以编程方式在共享主机计划上创建插件域

Posted

技术标签:

【中文标题】如何以编程方式在共享主机计划上创建插件域【英文标题】:How To Programmatically Create Addon Domains on Shared Hosting Plans 【发布时间】:2011-03-14 06:50:59 【问题描述】:

在使用 cpanel 管理的基于 Linux 的共享主机上,如果我知道我的 cpanel 登录信息和/或 FTP 信息,是否可以通过编程方式为我的站点创建某种可靠的插件域?

注意:本例对 php 和 cpanel 感兴趣。

【问题讨论】:

【参考方案1】:

这取决于您的 DNS 服务器是否托管在您控制的某个地方,以及是否有 API 可以修改 DNS 条目(或者只是访问 DNS 服务器本身的配置)。我不是 cPanel 用户,但我倾向于“不”。

在您控制 DNS 服务系统的环境中,编写代码向您的 DNS 记录添加更多条目(尽管显然传播仍然需要时间)并将新站点放入sites-enabled 是相当简单的。安全和安全地进行操作也可能非常困难,但你去吧。但我怀疑你通过 cPanel 有这种能力。

刚刚想到的是能够使用包罗万象的域(在您的 Apache 配置文件中有一个默认站点条目,所有未指定的子域都可能指向)并以编程方式确定应该从那里运行的站点,但是有很多这种方法的负面影响,我什至不建议查看它。

【讨论】:

+1 这也正是我想说的。除非 cPanel 提供 API,否则您无能为力。 @Ed Roople:我不明白这个答案与这个问题有什么关系,根据标签,他问的是如何在共享主机上通过 cPanel 添加域,而不是如何添加域直接在 DNS 和 Apache 上,具有服务器根访问权限。 我认为您应该阅读第一条评论;它回答得很清楚。除非 cPanel 提供 API,否则几乎没有什么可以做的。因此,“但我怀疑你通过 cPanel 拥有这种能力。”【参考方案2】:

我曾经使用 fopen 执行此操作 - 我不记得确切的 URL,并且我无法再访问 cPanel,但是如果您检查正在使用的 url,您应该能够执行类似的操作

fopen("https://username:pass@domain.com:1084/cpanel/doaddparked.html?domain=domain.com", "r");

(你必须检查路径和端口,我不记得这些了)——我上次在两年前的一个项目中这样做,我们的注册通过 cpanel 创建了电子邮件——从那时起他们可能已经改变了它,但我发现这是最简单的方法。当时,他们肯定是在处理 GET 数据而不是 POST,如果将其更改为 POST,您可能需要查看 CURL。

【讨论】:

这可能行得通,但如果您选择走这条路,您需要非常小心,确保您的共享主机提供商同意。老实说,如果您正在做一些复杂到需要它的事情,那么您不应该使用共享主机。【参考方案3】:

您可以使用 cPanel API,文档为here。 它不是那么容易阅读,如果你想和他们一起玩 PHP,你可以使用免费的 PHP 类(在幕后使用这些 API),一些是 here on cPanel forum,另一些是 here。

【讨论】:

【参考方案4】:

感谢@Alex C 让我走上了正轨。以下内容适用于许多共享托管计划,但您需要先查看他们的政策。

在下面的示例中,我已经购买了 root.com 作为我共享主机计划的主要根域。然后,我希望添加一个名为 addon.com 的域。我将用户名设置为 addon_user 并将 pass 设置为 addon_pass。同样,我将新域的文件放在 public_html/addon.com 中。为了连接到 Cpanel 以实现这一点,我输入了一个 cpanel 主页 URL(随托管计划而异),以便可以对其进行解析和重用。另外,我提供了我的 root.com 的 cpanel 用户/密码信息作为 root_user 和 root_pass。

最后一个 echo 语句只是输出响应,无论它是否有效。但是,如果您想解析它是否失败,您可能可以解析“未添加”这个短语。

请注意,某些托管计划会阻止 file_get_contents 连接到 URL,因此您可能必须使用 fopen($sURL, 'r') 或 Curl API 进行切换。

<?php

// @ input vars - change these as you see fit
$sPastedCpanelHomepageURL = 'https://root.com:2083/frontend/x3/index.html';
$sNewDomain = 'addon.com';
$sNewDomainUser = 'addon_user';
$sNewDomainPass = 'addon_pass';
$sNewDomainFolder = 'public_html/addon.com';
$sCPanelUser = 'root_user';
$sCPanelPass = 'root_pass';

// @ processing
$sCP = dirname($sPastedCpanelHomepageURL);
$sCP = str_replace('://','://' . $sCPanelUser . ':' . $sCPanelPass . '@',$sCP);

$sTask = '/addon/doadddomain.html?';

$sNewDomain = urlencode($sNewDomain);
$sNewDomainUser = urlencode($sNewDomainUser);
$sNewDomainPass = urlencode($sNewDomainPass);
$sNewDomainFolder = urlencode($sNewDomainFolder);
$sCPanelUser = urlencode($sCPanelUser);
$sCPanelPass = urlencode($sCPanelPass);

$asData = array(
  'domain' => $sNewDomain,
  'user' => $sNewDomainUser,
  'dir' => $sNewDomainFolder,
  'pass' => $sNewDomainPass,
  'pass2' => $sNewDomainPass
);
$sData = http_build_query($asData);

$s = file_get_contents($sCP . $sTask . $sData);

echo "$s\n";

【讨论】:

所以端口是 2083 而不是 Alex C 建议的 1084,只是想知道因为我也对此感兴趣。 实际上,网络托管服务提供商有时会更改端口,如 cpanel 的主页 URL。 $sCPanelPass 的安全性如何?如果有人用 http 而不是 https 粘贴 $sPastedCpanelHomepageURL?服务器会在某处存储请求的 URL(密码为纯文本)吗?此请求或源 php 文件在将来被存储/抓取/找到的风险是什么,从而使您的根托管受到损害? (或者我们应该在每次使用这个脚本后手动更改密码?:D) 重点是展示如何解决问题。代码和服务器安全超出了问题的范围。显然,应该采取更多的预防措施。 @Volomike 如何删除通过 php 创建的域?

以上是关于如何以编程方式在共享主机计划上创建插件域的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法从主机应用程序获取应用程序组标识符并在 iOS 上共享扩展程序?

共享主机更适合 SaaS 应用程序还是云主机?

在共享主机域上禁用 Apache(批量)modpagespeed

如何在子域共享主机上安装 laravel

A2Hosting 用于电子邮件的共享主机计划,DNS 和网站托管在 AWS 上

以编程方式在 linux 上触发 inotify 事件