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

使用.htaccess(PHP)动态创建子域,php,.htaccess,dns,virtualhost,subdomain,Php,.htaccess,Dns,Virtualhost,Subdomain,我期待着创建一个系统,注册后将在我的网站上为用户帐户区域创建一个子域 e、 g.johndoe.website.com 我想这可能与.htaccess文件有关,还可能重定向到网站上的其他位置?我真的不知道。但任何能让我开始的信息都将不胜感激 创建一个注册区域不是问题——我已经做过很多次了。我只是不确定从哪里开始子域 这与.htaccess无关。您需要为子域设置DNS记录和虚拟主机。您可以首先允许每个子域,然后检查子域是否有效。例如: RewriteEngine on RewriteCond %{

我期待着创建一个系统,注册后将在我的网站上为用户帐户区域创建一个子域

e、 g.johndoe.website.com

我想这可能与.htaccess文件有关,还可能重定向到网站上的其他位置?我真的不知道。但任何能让我开始的信息都将不胜感激


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

这与.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服务器接受每个子域名。

快速运行
  • 您需要在DNS服务器*.website.com上创建通配符域
  • 然后在vhost容器中,您还需要指定通配符*.website.com-这是在
  • 然后在PHP中提取并验证子域,并显示适当的数据
  • 长版本 1.创建通配符DNS条目 在DNS设置中,您需要创建一个类似于
    *.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编辑器创建DNS设置

  • 使用主机ip地址中的主机
    *
    通配符在DNS设置中创建
    记录

    ip地址中的
    *1400

  • 再次在DNS设置中创建一个
    a
    记录,主机
    @
    或服务器ip地址中的
    域名.tld
    。tld是指顶级域或域的扩展,如.com、.org等

    ip地址中的
    @1400
    或 ip地址中的域名tld 1400

  • 创建
    CNAME
    记录如下:

    域名中的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

  • 如果您不想使用htaccess将数据作为参数传递,也可以使用以下编码获取数据:

    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