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

mrfwxfqh  于 2022-11-16  发布在  PHP
关注(0)|答案(9)|浏览(194)

我正在寻找创建一个系统,在注册时将创建一个子域在我的网站上的用户帐户区。
例如johndoe.website.example
我认为这将是一些与.htaccess文件和可能重定向到网站上的另一个位置?我不知道。但任何信息开始我将非常感谢。
创建一个注册区域并不是问题-我已经做过很多次了。我只是不确定从哪里开始创建子域。

pkmbmrz7

pkmbmrz71#

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

1.创建通配符DNS条目

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

*.example.org.   3600  A  127.0.0.1

2.在vhost中包含通配符

接下来,在Apache配置中,您需要设置一个vhost容器,该容器在ServerAlias DOCs指令中指定通配符。

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

3.在PHP中计算出您所在的子域

然后在PHP脚本中,你可以通过查看超级全局变量$_SERVER来找到这个域。下面是一个在PHP中获取子域的例子:

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

我在这里使用regex来允许人们通过www.subdomain.example.orgsubdomain.example.org访问您的网站。
如果你从来没有想过要处理www.(或其他子域),那么你可以简单地使用这样的子字符串:

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

大规模虚拟主机

大规模虚拟主机是一个稍微不同的方案,以上述在你通常会用它来托管许多不同的网站,而不是试图使用它的权力的应用程序的问题提出.
我已经在post on my blog中记录了我的基于mod_rewrite的大规模虚拟主机环境,如果你想走这条路,你可以看看。当然,还有相应的Apache手册页。
Apache也有一个处理大规模虚拟主机的内部方法,它比我使用的mod_rewrite方法灵活性稍差一些。这在Apache动态配置的大规模虚拟主机手册页中有详细描述。

xdyibdwo

xdyibdwo2#

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

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

20jt8wwn

20jt8wwn3#

除了设置DNS通配符之外,您可能还想了解一下Dynamic Mass Virtual Hosting for Apache,这是我过去解决此问题的方法

anauzrmj

anauzrmj4#

我发现用PHP做起来更容易。实际上就是在cPanel中创建一个子域,然后在所需的域名下创建文件夹。因为你会在cPanel中手动完成,但所有这些都是通过一个简单的PHP函数在毫秒内完成的。不需要点击:)

function create_subdomain($subDomain,$cPanelUser,$cPanelPass,$rootDomain) {

    //  $buildRequest = "/frontend/x3/subdomain/doadddomain.html?rootdomain=" . $rootDomain . "&domain=" . $subDomain;

    $buildRequest = "/frontend/x3/subdomain/doadddomain.html?rootdomain=" . $rootDomain . "&domain=" . $subDomain . "&dir=public_html/subdomains/" . $subDomain;

    $openSocket = fsockopen('localhost',2082);
    if(!$openSocket) {
        return "Socket error";
        exit();
    }

    $authString = $cPanelUser . ":" . $cPanelPass;
    $authPass = base64_encode($authString);
    $buildHeaders  = "GET " . $buildRequest ."\r\n";
    $buildHeaders .= "HTTP/1.0\r\n";
    $buildHeaders .= "Host:localhost\r\n";
    $buildHeaders .= "Authorization: Basic " . $authPass . "\r\n";
    $buildHeaders .= "\r\n";

    fputs($openSocket, $buildHeaders);
        while(!feof($openSocket)) {
           fgets($openSocket,128);
        }
    fclose($openSocket);

    $newDomain = "http://" . $subDomain . "." . $rootDomain . "/";

   //  return "Created subdomain $newDomain";

}
  • 如欲了解更多信息,请访问:http://vikku.info/programming/php/create-subdomain-dynamically-in-php-code-to-create-subdomains-in-server-using-php.htm#sthash.HV4D2Uig.dpuf
enyaitl3

enyaitl35#

最简单的方法是重定向所有子域(使用通配符 *),使其指向您的/wwwroot。然后使用以下代码将.htaccess放入该文件夹:

RewriteCond %{ENV:REDIRECT_SUBDOMAIN} =""
RewriteCond %{HTTP_HOST} ^([a-z0-9][-a-z0-9]+)\.domain\.example\.?(:80)?$ [NC]
RewriteCond %{DOCUMENT_ROOT}/%1 -d
RewriteRule ^(.*) %1/$1 [E=SUBDOMAIN:%1,L]
RewriteRule ^ - [E=SUBDOMAIN:%{ENV:REDIRECT_SUBDOMAIN},L]

这将实现/wwwroot文件夹的每个子文件夹都通过子域(foldername.domain.example)可接受。
几年前在http://www.webmasterworld.com/apache/3163397.htm上找到的

cbjzeqam

cbjzeqam6#

这与. htaccess无关。您需要为子域设置DNS记录和虚拟主机。

vnzz0bqm

vnzz0bqm7#

Mod_vhost_alias是完成此任务的合适模块。
通过一行代码,您可以告诉Apache查看正确的位置,使用目录散列等。例如,以下代码行:

VirtualDocumentRoot /http/users/%3.1/%3.2/%3

我会告诉Apache在请求subdomain.yourdomain.example时将文档根设置为/http/users/s/u/subdomain

wmtdaxz3

wmtdaxz38#

我认为Apache的动态大规模虚拟主机的通配符DNS也是一个合理的解决方案。虽然,我从来没有尝试过。
如果您需要扩展到多个服务器,或者其他解决方案不适合您,我建议您使用数据库驱动的DNS服务器。(或PostgreSQL)你可以用PHP或其他任何东西来动态更新你的DNS。代码看起来不像是有一段时间更新过了,但它是DNS,因此不是最先进的。

watbbzwu

watbbzwu9#

通配符子域创建方法

首先,您必须使用服务器DNS编辑器创建DNS设置。
1.在DNS设置中创建A记录,在服务器IP地址中使用主机*通配符。
* 1400 IN A ip_address
1.在DNS设置中再次创建一条A记录,服务器IP地址为主机@domainname.example。tld表示顶级域或域的扩展名,如.com、.org等。
@ 1400 IN A ip_addressdomainname.example 1400 IN A ip_address
1.创建CNAME记录,如下所示:
www 1400 IN A domainname.example
1.使用*通配符创建子域,如*.domainname.example
1.在您的*.domainname.example子网域目录中建立.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

测试第一个通配符子域,如some.domainname.example
如果您不想使用.htaccess将数据作为参数传递,也可以使用以下编码获取数据:

define("SUBDOMAIN_PARENT","domainname.example");
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_data

echo $get_data->data; //example

(note:这个类主要用于从http_host中获取准确的子域名。因为在您的子域名之前组合的一些额外的名称也是适用的,如www.some.domainname.example。这个返回$_GET['data']='wwww'。所以我的建议是使用$_SERVER['http_host']来获取准确的值,而不是使用$_SERVER['query_string']或在您的索引页中传递.htaccess参数)
6.加速执行这个通配符子域在TTL-DNS SETTINGS中使用N秒。
7.在指定的ttl时间(600 - 10分钟)后检查子域,如=〉http://abc.domainname.example
(note:通配符子域不会覆盖现有子域。因为第一优先级始终适用于您现有的子域)

相关问题