使用.htaccess(PHP)动态创建子域
我期待着创建一个系统,注册后将在我的网站上为用户帐户区域创建一个子域 e、 g.johndoe.website.com 我想这可能与.htaccess文件有关,还可能重定向到网站上的其他位置?我真的不知道。但任何能让我开始的信息都将不胜感激使用.htaccess(PHP)动态创建子域,php,.htaccess,dns,virtualhost,subdomain,Php,.htaccess,Dns,Virtualhost,Subdomain,我期待着创建一个系统,注册后将在我的网站上为用户帐户区域创建一个子域 e、 g.johndoe.website.com 我想这可能与.htaccess文件有关,还可能重定向到网站上的其他位置?我真的不知道。但任何能让我开始的信息都将不胜感激 创建一个注册区域不是问题——我已经做过很多次了。我只是不确定从哪里开始子域 这与.htaccess无关。您需要为子域设置DNS记录和虚拟主机。您可以首先允许每个子域,然后检查子域是否有效。例如: RewriteEngine on RewriteCond %{
创建一个注册区域不是问题——我已经做过很多次了。我只是不确定从哪里开始子域 这与.htaccess无关。您需要为子域设置DNS记录和虚拟主机。您可以首先允许每个子域,然后检查子域是否有效。例如:
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服务器接受每个子域名。快速运行
*.example.org
。通配符条目如下所示:
*.example.org. 3600 A 127.0.0.1
2.在vhost中包含通配符
接下来在Apache配置中,您需要设置一个vhost容器来指定指令中的通配符。vhost容器示例:
<VirtualHost *:80>
ServerName server.example.org
ServerAlias *.example.org
UseCanonicalName Off
</VirtualHost>
我在这里使用regex允许人们通过www.subdomain.example.org或subdomain.example.org访问您的站点
如果您从未预料到必须处理www(或其他子域),那么您可以简单地使用如下子字符串:
$subdomain = substr(
$_SERVER['SERVER_NAME'], 0,
strpos($_SERVER['SERVER_NAME'], '.')
);
大规模虚拟主机
大规模虚拟主机与上述方案略有不同,因为您通常会使用它来托管许多不同的网站,而不是像问题所建议的那样尝试使用它来驱动应用程序
我以前在一篇文章中记录了我的基于mod_重写的大规模虚拟主机环境,如果这是您希望采取的路线,您可以查看一下。当然,还有一个问题
Apache还有一种处理大规模虚拟主机的内部方法,与我使用的mod_重写方法相比,它的灵活性稍差。这在Apache上都有描述。除了设置DNS通配符之外,您可能还想看看我过去是如何解决这一问题的。我认为使用Apache的动态大规模虚拟主机的通配符DNS也是一个合理的解决方案。尽管如此,我从未尝试过
如果您需要扩展到多个服务器,或者其他解决方案不适合您,我建议使用数据库驱动的DNS服务器。我曾经成功地使用过。由于它使用MySQL(或PostgreSQL),您可以使用PHP或其他任何东西动态更新DNS。代码看起来并不是在一段时间内更新的,但它是DNS,因此不是最先进的 最简单的方法是重定向所有子域(使用通配符*)以指向您的/wwwroot。 然后使用以下代码将.htaccess放入此文件夹:
RewriteCond %{ENV:REDIRECT_SUBDOMAIN} =""
RewriteCond %{HTTP_HOST} ^([a-z0-9][-a-z0-9]+)\.domain\.com\.?(:80)?$ [NC]
RewriteCond %{DOCUMENT_ROOT}/%1 -d
RewriteRule ^(.*) %1/$1 [E=SUBDOMAIN:%1,L]
RewriteRule ^ - [E=SUBDOMAIN:%{ENV:REDIRECT_SUBDOMAIN},L]
这将通过子域(foldername.domain.com)实现/wwwroot文件夹中的每个子文件夹都是可接受的
这是几年前在
是执行此操作的正确模块
只需一行代码,您就可以告诉Apache查看正确的位置,使用目录哈希等。
例如,行:
VirtualDocumentRoot /http/users/%3.1/%3.2/%3
当请求subdomain.yourdomain.com时,我会告诉Apache将文档根目录设置为/http/users/s/u/subdomain。我发现使用PHP更容易。实际上,您正在cPanel中创建一个子域,并在所需的域名下创建文件夹。正如您将在cPanel中手动完成的那样,但所有这些都是通过一个简单的PHP函数在毫秒内完成的。无需单击:)
- 更多信息,请访问:
*
通配符在DNS设置中创建记录
ip地址中的*1400
a
记录,主机@
或服务器ip地址中的域名.tld
。tld是指顶级域或域的扩展,如.com、.org等
ip地址中的@1400
或
ip地址中的域名tld 1400CNAME
记录如下:
域名中的www.1400.tld
*
通配符创建子域,如*.domain.tld
*.domain.tld
的子域目录中创建htaccess,并将此代码放入:
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule ^([aA-zZ0-9]+)$ index.php?data=$1
RewriteCond %{HTTP_HOST} ^([aA-zZ0-9]+)\.([aA-zZ0-9-]+)\.([aA-zZ]+)
RewriteRule ([aA-zZ0-9]+) index.php?data=%1
测试第一个通配符子域,如example.domainname.tld
define("SUBDOMAIN_PARENT","domainname.tld");
class getData
{
function __construct()
{
$this->data="";
$http_host=$_SERVER['HTTP_HOST'];
$subdom_data= str_replace(SUBDOMAIN_PARENT,"",$http_host);
$expl_subdom_data=explode(".",$subdom_data);
$expl_subdom_data=array_filter($expl_subdom_data);
if($expl_subdom_data!=NULL)
{
$this->data=end($expl_subdom_data);
}
}
}
$GLOBALS['get_data']=new getData();
并在任何位置使用全局变量,如global$get\u data
echo $get_data->data; //example
(注意:该类主要用于从http\u主机
获取准确的子域名。因为子域前组合的一些额外名称也适用,如www.example.domainname.tld
。此返回值$\u get['data']='wwwww'
,因此我建议使用$\u服务器['http\u主机]]
获取准确值,而不是使用$\u服务器['query\u string']
或在索引页中传递的htaccess参数)
6.在TTL-DNS设置中使用N秒加速此通配符子域的执行
7.在给定的ttl时间(600-10分钟)后检查子域,如=>http://abc.domain.tld
(注:通配符子域n
define("SUBDOMAIN_PARENT","domainname.tld");
class getData
{
function __construct()
{
$this->data="";
$http_host=$_SERVER['HTTP_HOST'];
$subdom_data= str_replace(SUBDOMAIN_PARENT,"",$http_host);
$expl_subdom_data=explode(".",$subdom_data);
$expl_subdom_data=array_filter($expl_subdom_data);
if($expl_subdom_data!=NULL)
{
$this->data=end($expl_subdom_data);
}
}
}
$GLOBALS['get_data']=new getData();
echo $get_data->data; //example