PHP域名映射脚本

3

我不知道这个确切术语是什么,所以我的标题可能不正确。

基本上我想做的是编写一个具有输入字段的PHP脚本:

Domain Name: <input type='text' name='dname' id='dname' value='http://example.com' />
<input type='submit' name='addname' value='Add A Domain' />

当用户在文本框中输入自己的域名并提交后,脚本将自动创建一个目录,在其中复制一些PHP脚本,并将域名映射到该目录中。(当然,域名指向我们的服务器。)
我已经解决了mkdir()和copy()部分,但是我无法解决映射部分。如何使用PHP自动添加一个条目来将http://example.com映射到/home/user/public_html/copy1/?

1
我非常确定你需要使用Apache VirtualHosts来完成这个任务... 你有root级别的服务器访问权限吗?(注意:这里假设使用的是Apache,但适用于所有类型的服务器) - Tom van der Woerdt
如果您在此处尚未使用任何URL编码或框架,则可以解析URL。例如,如果“http://example.com/new/rajat”是输入字段的值,则可以将其变为/home/user/public_html/new/rajat。您需要做的就是将.com后面的部分附加到.../public_html/即可。 - Rajat Singhal
@Rajat 不是的。目录名称无关紧要。映射后,用户在使用FTP时将看不到/home/user/public_html/copy1/,他们只会看到该目录上的文件。就像redShadow所说的那样,我们可以简单地将域名转换为slug并使用它。 - Rufas Wan
3个回答

2
虽然您可以直接从PHP页面执行此操作,但出于许多原因,我建议不要这样做,包括高风险(例如页面执行突然中断)和安全风险(httpd用户将具有对自身配置和某些不应访问的文件系统上的一些内容的写入权限)。

一段时间以前,我编写了一个类似的控制“网站创建控制面板”,工作方式非常相似:

  • php脚本接收网站创建请求并将其存储在某个位置(例如数据库)。
  • 另一个脚本每隔五分钟作为root运行通过cron检查网站创建请求队列。如果有任何:
    • 将网站创建任务标记为“锁定”
    • 在适当的位置创建目录,并填充脚本等。
    • 根据需要更改所有权限
    • 创建新的虚拟主机配置,并启用它
    • 使Web服务器重新加载自己的配置
    • 将网站创建任务标记为“完成”

第二个脚本可以使用任何您喜欢的语言编写,如PHP、Python、Bash等。

关于Apache配置

要创建与您的域名“映射”的目录,您可以使用以下内容:

首先,“slugify”您的域名。我通常采用(经过净化的!)域名,并将所有点转换为双破折号(这不是有效的域名部分)。除了文件扩展名分离外,我不喜欢文件/目录名称中的点。

然后,您可以创建类似于以下内容的内容(假设域名为www.example.com):

<VirtualHost *:80>
  ServerName www.exampple.com

  DocumentRoot `/my-sites/wwwroot/www--example--com`

  <Directory "/my-sites/wwwroot/www--example--com">
    Options -Indexes FollowSymLinks
    Order allow,deny
    Allow from all
    AllowOverride All
  </Directory>

  ErrorLog /var/log/apache2/www--example--com_error.log
  CustomLog /var/log/apache2/www--example--com_access.log vhost_combined
</VirtualHost>

<VirtualHost *:80>
    ## redirect non-www to www
    ServerName www.example.com
    ServerAlias example.com

    RedirectMatch permanent ^(.*) http://www.example.com$1
</VirtualHost>

假设您将网站文件放置在类似于/my-sites/wwwroot/www--example--com的目录中。

一些与安全相关的改进

在我的情况下,我也更喜欢不以root身份运行第二个脚本;为了这样做,您需要进行一些更改,以让一个权限较低的用户在您的系统上执行某些操作:

  • 创建一个具有写访问权限的目录,比如说/my-sites/conf/vhosts
  • 创建一个Apache虚拟主机,其中包含以下行:Include "/my-sites/conf/vhosts/*.vhost",并启用它

然后,让您的用户重新加载Apache配置,通过安装sudo并将其添加到您的/etc/sudoers中:

Cmnd_Alias A2RELOAD = /usr/sbin/apache2ctl graceful

youruser ALL=NOPASSWD: A2RELOAD
%yourgroup  ALL = NOPASSWD: A2RELOAD

当然,还需要将您网站的基础目录赋予写权限,以便运行脚本的用户可以访问。


如果我保护脚本,只允许一些特定的人访问表格,这样会更好吗? - Rufas Wan
当然,你必须使用某种登录/访问控制来保护“可见”的脚本;无论如何,你应该创建像我描述的东西来执行这些管理任务,否则很可能会遇到错误/安全问题。 - redShadow
@redShadow,你能帮我解决这个问题吗?https://stackoverflow.com/questions/66022215/domain-mapping-setup-for-slug-of-a-different-domain - foxenn_pro

0

0

现在已经过去了10个月,所以我只会建议我所发现的。

虽然直接写入httpd.conf似乎是唯一的方法,但最近我们的网站更改了服务器。这导致我们在文件/文件夹权限方面遇到了很多麻烦,而托管公司由于安全问题拒绝帮助我们。

因此,我重新审视并发现我正在使用CPanel进行托管,我肯定可以使用Addon Domain功能来创建和添加新域名。

但它也有其限制。由于它是一个附加域,我们不能再限制每个域的带宽和磁盘使用量。一切都是共享的。但对我们来说无关紧要。

到目前为止,它运作良好。您可以通过使用官方cpanel网站上提供的CPanel API库,或者您可以使用直接的URL请求方式来创建域。由于我们正在创建一个新的wordpress安装,因此我们还创建了一个新的数据库。

http://{username}:{password}@{mysite.com}:2082/frontend/x3/sql/addb.html?db={dbname}
http://{username}:{password}@{mysite.com}:2082/frontend/x3/sql/adduser.html?user={dbuser}&pass={dbpass}
http://{username}:{password}@{mysite.com}:2082/frontend/x3/sql/addusertodb.html?db={dbname}&user={dbuser}&ALL=ALL
http://{username}:{password}@{mysite.com}:2082/frontend/x3/addon/doadddomain.html?domain={newsite.com}&user={ftp_user}&dir={ftp_dir}&pass={ftp_pass}&pass2={ftp_pass}

它不一定是WordPress。您可以使用它来安装Joomla、Drupal、phpBB甚至您自定义的脚本。

希望这能帮助任何正在阅读此文的人。谢谢。


你能帮我解决这个问题吗?https://stackoverflow.com/questions/66022215/domain-mapping-setup-for-slug-of-a-different-domain - foxenn_pro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接