【问题标题】:Create a sub domain with only PHP (cross-host)创建一个只有 PHP 的子域(跨主机)
【发布时间】:2020-10-12 18:50:17
【问题描述】:

我见过很多涉及使用 .htaccess 的解决方案。我想知道一种仅使用 PHP 创建子域的方法。就我的目的而言,这也需要使用非主机特定的机制来工作,以便它适用于大多数主机。

我只知道我需要一个通配符 CNAME 记录,它表示所有子域都指向 x.x.x.x,但我不知道从这里做什么。我认为您需要做的是创建一个包含子域代码的文件夹,我已经这样做了,但是我找不到将子域与文件夹链接的跨主机方式。正如我所看到的那样,必须有一种方法可以做到这一点,但我找不到满足我需求的方法。

【问题讨论】:

    标签: php web dns cross-platform wildcard-subdomain


    【解决方案1】:

    这里的问题是 PHP 不处理传入的请求,Web 服务器(例如 Apache 或 Nginx)会处理,它是该软件的配置来确定请求的去向。现在好消息是,您可以在配置中使用通配符(至少对于 Apache 和 Nginx,如果您不使用其中之一,则为 YMMV),只要您可以访问配置文件(您需要在服务器)。根据您使用的网络服务器,有大量可用信息可供您使用,因此您可以通过谷歌搜索该部分。

    现在,假设您已经完成了该部分,在 PHP 中您只需要检查请求的根域是什么。该信息存储在$_SERVER['HTTP_HOST'] 中,因此您可以使用一个简单的脚本来确定请求了哪个子域,然后为该子域启动适当的脚本。像这样的东西应该可以解决问题:

    // Assuming request comes from https://subdomain.mydomain.com
    $subdomain = str_replace('.mydomain.com', '', $_SERVER['HTTP_HOST']);
    echo $subdomain // Outputs "subdomain"
    

    这也将捕获多个级别的子域,因此如果您的请求来自https://sub1.sub2.subdomain.mydomain.com,那么$subdomain 将包含sub1.sub2.subdomain


    评论后编辑

    您无法通过共享主机做到这一点。基本上是您从主机获得的配置面板,当您设置域或子域时,它会为您修改服务器上的配置文件。为了安全起见,主机不允许任何人通过控制面板以外的任何方式访问配置。主机可能会有与您的测试服务器类似的设置,其中子域默认使用通配符,但我不知道,也不能保证。

    WordPress 本身只是博客软件。它不允许您使用自己的安装设置许多单独的网站。什么 WordPress Multisite(我假设这就是您提到 WordPress 时的意思)是使用单个安装来托管多个“站点”,但它仍然是一个安装,一个单个数据库。所有的帖子,所有的页面,它们都存储在一个数据库中,如果您进入该数据库,您只需编辑数据库中的某些字段,就可以轻松地将一个站点的页面包含在另一个站点上。它不是为转售或多个完全独立的实体而设计的。做这种事情有很多安全风险。它专为希望将其站点拆分为多个站点的单个实体而设计,但它们都是一家公司或相关公司。拥有不同部门的大学是我之前读到的一个例子,每个部门都有自己的“站点”,主要的 IT 办公室有一个超级用户,可以访问所有部门,因为它在一个单一的安装上。

    我可以提供更多关于您正在尝试做的事情的信息,但听起来您正在尝试做类似 WPEngine 的事情,他们在那里出售托管空间并为您安装 WordPress。但是他们有专门的服务器来运行脚本,这些脚本创建配置文件并使用他们的服务器在您自己的个人托管空间上安装 WordPress。这就是所谓的 SaaS(软件即服务),从您所说的那一点点来看,您似乎正在尝试做些什么。人们订阅您的网站并获得他们自己销售的软件实例,他们可以通过管理门户访问这些实例。这不是他们可以在自己的主机上安装的东西,他们必须使用你的。大多数公司都是这样做的。

    【讨论】:

    • 你能解释一下我在配置中要做的事情吗?问题是我正在尝试制作一个需要动态创建子域的基于 Web 的工具(如 wordpress)。我不知道我的用户是否会有 root 访问权限,就像在我的测试 Web 服务器上一样,我没有。大多数时候你没有。在我的测试服务器上,我只是在根目录中放置了一个名为 xxx.domain.com 的文件夹,只要该子域指向该服务器,它就会计算出来。但是,我不知道这是否是其他主机。
    • @TCoder WP 不会即时创建子域,PHP 中没有任何东西可以访问服务器来执行此操作。他们最多可以触发服务器上为他们执行此操作的脚本。我不完全确定你想从你所给予的那一点中获得什么,这是一个很大的话题。我已经用更多信息更新了我的答案,因为它超出了这个 cmets 部分的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    相关资源
    最近更新 更多