当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用.htaccess(PHP)动态创建子域》经验,为你挑选了5个好方法。

我希望创建一个系统,在注册时将在我的网站上为用户帐户区域创建一个子域.

例如johndoe.website.com

我认为这与.htaccess文件有关,可能会重定向到网站上的其他位置?我其实不知道.但任何启动我的信息将不胜感激.

创建注册区域不是问题 - 我已经做了很多次.我只是不确定从哪个子域开始.



1> Treffynnon..:

快速破旧

    您需要在DNS服务器*.website.com上创建通配符域

    然后在您的vhost容器中,您还需要指定通配符*.website.com - 这是在DOC中完成的ServerAlias

    然后在PHP中提取并验证子域并显示相应的数据

长版

1.创建通配符DNS条目

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

*.example.org.   3600  A  127.0.0.1

2.在vhost中包含通配符

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


  ServerName server.example.org
  ServerAlias *.example.org
  UseCanonicalName Off

3.找出你在PHP中使用的子域

然后在PHP脚本中,您可以通过查看$_SERVER超级全局变量来查找域.以下是在PHP中抓取子域的示例:

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

我在这里使用了正则表达式,允许人们通过www.subdomain.example.org或subdomain.example.org访问您的网站.

如果你从未预料到必须处理www.(或其他子域)那么您可以简单地使用子字符串,如下所示:

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

大规模虚拟主机

大规模虚拟主机与上述方案略有不同,因为您通常会使用它来托管许多不同的网站,而不是尝试使用它为问题提出的应用程序提供支持.

我之前在博客上的帖子中记录了我的基于mod_rewrite的大规模虚拟主机环境,如果这是你想要的路线,你可以看一下.当然,还有相应的Apache手册页.

Apache还有一种处理大规模虚拟主机的内部方法,它比我使用的mod_rewrite方法稍微灵活一些.这些都在Apache 动态配置的群发虚拟主机手册页上进行了描述.



2> Gumbo..:

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

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]);
}

但所有这些都要求您的网络服务器接受每个子域名.


此外,它要求您的DNS服务器解析每个子域名.

3> Rowland Shaw..:

除了设置DNS通配符之外,您可能想看看Apache的动态群发虚拟主机,这是我过去解决这个问题的方法.


对于版本2.4:http://httpd.apache.org/docs/current/vhosts/mass.html

4> Glavić..:

最简单的方法是将所有子域(带通配符*)重定向到指向/ 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]

这将完成/ wwwroot文件夹的每个子文件夹在可接受的子域(foldername.domain.com)中.

多年前在http://www.webmasterworld.com/apache/3163397.htm上 找到



5> Adrian P...:

我发现用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

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有