使用 .htaccess (PHP) 动态创建子域

2022-08-30 07:09:42

我希望创建一个系统,该系统在注册时将在我的网站上为用户帐户区域创建一个子域。

例如:johndoe.website.example

我认为这与文件有关,并可能重定向到网站上的另一个位置?我其实不知道。但是,任何让我开始的信息将不胜感激。.htaccess

创建注册区域不是问题 - 我已经做了很多次了。我只是不确定从哪里开始使用子域。


答案 1

快速概述

  1. 您需要在 DNS 服务器上创建通配符域*.website.example
  2. 然后在 vhost 容器中,您还需要指定通配符 - 这是在 ServerAlias DOC 中完成的*.website.example
  3. 然后提取并验证PHP中的子域并显示相应的数据

长版本

1. 创建通配符 DNS 条目

在 DNS 设置中,您需要创建通配符域条目,例如 。通配符条目如下所示:*.example.org

*.example.org.   3600  A  127.0.0.1

2. 在虚拟主机中包含通配符

接下来,在 Apache 配置中,您需要设置一个 vhost 容器,该容器在 ServerAlias DOCs 指令中指定通配符。示例虚拟主机容器:

<VirtualHost *:80>
  ServerName server.example.org
  ServerAlias *.example.org
  UseCanonicalName Off
</VirtualHost>

3. 找出您在PHP中的哪个子域

然后,在 PHP 脚本中,您可以通过查找超级全局变量来查找域。下面是在 PHP 中抓取子域的示例:$_SERVER

preg_match('/([^.]+)\.example\.org/', $_SERVER['SERVER_NAME'], $matches);
if(isset($matches[1])) {
    $subdomain = $matches[1];
}

我在这里使用了正则表达式,以允许人们通过 或 访问您的网站。www.subdomain.example.orgsubdomain.example.org

如果您从未预料到必须处理www。(或其他子域),然后你可以简单地使用如下子字符串:

$subdomain = substr(
                 $_SERVER['SERVER_NAME'], 0,
                 strpos($_SERVER['SERVER_NAME'], '.')
             );

大规模虚拟主机

大规模虚拟主机与上述方案略有不同,因为您通常会使用它来托管许多不同的网站,而不是像问题所建议的那样尝试使用它来支持应用程序。

我之前在我的博客上的一篇文章中记录了我基于mod_rewrite大规模虚拟主机环境,如果这是您希望采取的路线,您可以查看。当然,还有相应的Apache手册页面

Apache还有一种处理大规模虚拟主机的内部方式,这种方式比我使用过的mod_rewrite方法的灵活性略低。这一切都在Apache动态配置的大规模虚拟主机手册页面上进行了描述。


答案 2

您可以首先允许每个子域,然后检查子域是否有效。例如:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^[^.]+\.example\.com$
RewriteRule !^index\.php$ index.php [L]

在里面,你可以比提取子域使用:index.php

if (preg_match('/^([^.]+)\.example\.com$/', $_SERVER['HTTP_HOST'], $match)) {
    var_dump($match[1]);
}

但所有这些都需要您的Web服务器接受每个子域名。


推荐