动态提供新的子域名

动态提供新的子域名

我有一项服务example.com需要允许用户在他们自己的子域中托管一些文件userpage-userabc.example.com,就像 Github 所做的那样userabc.github.io

我目前使用 Apache,每次我想要配置一个新的域或子域时,我都必须手动创建一个新的<VirtualHost>,重新启动 Apache 服务器等。这在这里是不可能的。

例如:如果访问者创建了一个新帐户userabc(添加到数据库中),如何使userpage-userabc.example.com子域可用,并自动从中提供文件/www/userabc/或使用提供http://userpage-userabc.example.com/服务/www/main/index.php?user=userabc

注意:*.example.com已经有一个通配符 A DNS 记录可以重定向到我的服务器

有什么简单的轻量级工具可以执行此“动态子域创建”?(我目前使用 Apache、PHP、Python,但我可以使用其他工具)。

或者是否可以使用一个<VirtualHost>捕获所有子域的RewriteRule*.example.com和一个包含子域的 RewriteRule ?

答案1

正如评论中提到的,这里是 Apache 的参考,有多种方法可以做到这一点:动态配置的海量虚拟主机使用 mod_rewrite 实现动态海量虚拟主机

经过多次测试,我发现最简单的解决方案是:一个<VirtualHost>

<VirtualHost *:80>
  ServerName example.com
  ServerAlias *.example.com
  DocumentRoot /www/example
  <Directory />
    AllowOverride All
    Require all granted
  </Directory>
</VirtualHost>

使用此通配符ServerAlias

包含.htaccess

RewriteEngine on
RewriteRule ^(.*)$ index.php [QSA,L]

然后我们可以通过 PHP 为每个用户完成所有路由:

<?php
$host = $_SERVER['HTTP_HOST'];
$sname = $_SERVER['SERVER_NAME'];
// parse the subdomain of $host or $sname and deliver 
// the content accordingly (using the database)
?>

好处:如果最终用户使用他自己的自定义域使用 CNAME DNS 记录。例如:

www.userabc.com CNAME userpage-userabc.example.com

然后在 PHP 中,$host这里将显示www.userabc.com。如果此自定义域信息位于数据库中的某个位置,我们可以相应地提供内容,即使用户使用的是自定义域

注意:对于使用 CNAME 的自定义域的用户,当请求带有指令中未列出的主机时,这有助于确定要使用的默认 VirtualHost ServerNameApache 默认虚拟主机

相关内容