我有一项服务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 ServerName
: Apache 默认虚拟主机。