如何自动将子域映射到子文件夹

Posted

技术标签:

【中文标题】如何自动将子域映射到子文件夹【英文标题】:How to map subdomain to subfolder automatically 【发布时间】:2015-02-24 15:45:09 【问题描述】:

我正在使用一个 php 脚本,该脚本在每个用户注册时为他创建一个子文件夹。例如:domain.com/users/user1

我需要将子域映射到这些子文件夹,例如:user1.domain.com.

我正在使用 XAMPP,我关注了this tutorial,它运行良好。

但我必须为每个用户/子域执行此操作!

我需要在用户注册时自动执行此操作。

【问题讨论】:

为什么要为每个用户设置一个子域?目的是什么?虚拟主机? @LucasF 是的,虚拟主机 这个问题应该发到ServerFault... 【参考方案1】:

我一直在考虑这个问题,但从未测试过。 我认为您应该尝试与某些 MVC 框架(例如 CodeIgniter)相同的方法

使用 index.php 路由所有请求。 获取 $_SERVER["HTTP_HOST"] 并解析它以获取您的子域。 现在根据您的子域加载相应的视图(MVC 中的视图)

【讨论】:

【参考方案2】:

您想在 Apache 上进行大规模虚拟主机。在这里您将找到如何执行此操作的信息:

Dynamically configured mass virtual hosting

根据您链接的教程中的示例:

NameVirtualHost *
  <VirtualHost *>
    DocumentRoot "C:\xampp\htdocs"
    ServerName localhost
  </VirtualHost>
  <VirtualHost *>
    DocumentRoot "C:\Documents and Settings\Me\My Documents\clientA\website"
    ServerName clientA.local
  <Directory "C:\Documents and Settings\Me\My Documents\clientA\website">
    Order allow,deny
    Allow from all
  </Directory>
</VirtualHost>
<VirtualHost *>
    DocumentRoot "C:\Documents and Settings\Me\My Documents\clientB\website"
    ServerName clientB.local
  <Directory "C:\Documents and Settings\Me\My Documents\clientB\website">
    Order allow,deny
    Allow from all
  </Directory>
</VirtualHost>

关于此配置的问题是,它是静态的,更改时需要重新启动 Apache。

首先,您需要在 DNS 服务器中创建一条记录,以便将所有子域映射到您的服务器。像这样:

*.local. 3600 IN A x.x.x.x

要在 localhost 上进行测试,您可以在 hosts 文件中手动设置一些子域。请参阅 here 为什么无法在 hosts 文件中设置通配符子域。

别忘了在 httpd.conf 中加载 vhost_alias_module:

LoadModule vhost_alias_module modules/mod_vhost_alias.so

然后你将替换你的虚拟主机配置,就像这个例子:

<VirtualHost *>
    # get the server name from the Host: header
    UseCanonicalName Off

    # this log format can be split per-virtual-host based on the first field
    LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
    CustomLog logs/access_log vcommon

    # include the server name in the filenames used to satisfy requests
    VirtualDocumentRoot "C:/Documents and Settings/Me/My Documents/%1/website"

    <Directory "C:/Documents and Settings/Me/My Documents/*/website">
        Options Indexes FollowSymLinks
        AllowOverride All
        Order allow,deny
        Allow from all
        Require all granted
        DirectoryIndex  index.php index.html index.htm
    </Directory>
</VirtualHost>

这将使用通配符来设置请求的子域的文档根目录。

【讨论】:

我知道这可能需要做很多工作,但是尝试将文档中的至少一个基本示例内联到您的答案中,以防万一链接发生变化(希望不会发生,因为它是 apache2 文档,但是谁知道),所以有一些具体的东西,将来其他人可以具体评论。 @LucasF 我以前读过这个主题,但我不能完全理解它或将它应用到我的网站上。你能在这里简化一下吗?【参考方案3】:

您可以安装web hosting control panel (如Plesk 或Webmin)来为您完成这项工作。您将使用友好的 GUI 来配置子域,所有细节配置都将在后台进行。这就是现实世界的托管服务提供商所使用的。

【讨论】:

【参考方案4】:

我通过使用服务器上的默认虚拟主机实现了类似的功能。假设你有你的 dns 设置,以便所有子域都指向适当的 IP 地址,那么它们应该都解析为默认的 vhost。默认虚拟主机指向的文件夹也需要有一个 index.php 文件,该文件利用子域来提供适当的内容。

您可以通过编辑 /etc/hosts 文件并将本地 dns 中的子域指向本地主机来使用 XAMPP 在本地复制此内容。将您的 webroot 设置为 index.php 文件所在的位置,并从 $_SERVER 变量中获取域名。从那里您可以通过子域确定用户并以编程方式显示内容。

【讨论】:

以上是关于如何自动将子域映射到子文件夹的主要内容,如果未能解决你的问题,请参考以下文章

无法使用httpd-vhosts.conf从子域重定向到子子域

如何将 Spring MVC 控制器映射到特定文件夹?

将本地端口映射子域名

将本地端口映射子域名

如何使用 Jackson 将 JSON 键值数组动态映射到子对象?

React - 将数组映射到子组件