使用.htaccess(PHP)快速创build子域

我正在寻找创build一个注册系统将在我的网站上为用户帐户区域创build一个子域。

如johndoe.website.com

我认为这将是与.htaccess文件,并可能redirect到网站上的另一个位置? 我其实不知道 但任何信息启动我将不胜感激。

创build注册区域不是问题 – 我已经做了很多次了。 我只是不确定从哪里开始子域。

快速破败

  1. 您需要在DNS服务器* .website.com上创build通配符域
  2. 然后在你的虚拟主机容器中,你也需要指定通配符* .website.com – 这是在ServerAlias DOC中完成的
  3. 然后提取并validationPHP中的子域,并显示适当的数据

长版

1.创build一个通配符DNS条目

在您的DNS设置中,您需要创build通配符域条目 ,如*.example.org 。 通配符条目如下所示:

 *.example.org. 3600 A 127.0.0.1 

2.将通配符包含在虚拟主机中

接下来在Apacheconfiguration中,您需要设置一个在ServerAlias DOCs指令中指定通配符的虚拟主机容器。 一个虚拟主机容器的例子:

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

3.找出你在PHP中的哪个子域

然后在您的PHP脚本中,您可以通过查看$_SERVER超级全局variables来查找域。 这里是一个抓住PHP中的子域的例子:

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

我在这里使用了正则expression式来允许人们通过www.subdomain.example.org或者subdomain.example.org打你的网站。

如果你从来不想处理www。 (或其他子域名),那么你可以简单地使用像这样的子string:

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

大规模虚拟主机

大容量虚拟主机是一个略有不同的scheme,因为您通常会使用它来托pipe许多不同的网站,而不是尝试使用它为应用程序提供权力。

我已经在我的博客文章中logging了我的基于mod_rewrite的大容量虚拟主机环境,你可以看看,如果这是你想要的路线。 当然,也有相应的Apache手册页 。

Apache也有处理大规模虚拟主机的内部方式,这比我使用的mod_rewrite方法稍微灵活一些。 这一切都在“Apache dynamicconfiguration大容量虚拟主机”手册页上进行了介绍 。

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

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

但所有这一切都要求您的networking服务器接受每个子域名。

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

最简单的方法是将所有子域(使用通配符*)redirect到/ 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文件夹中的每个子文件夹。

几年前在http://www.webmasterworld.com/apache/3163397.htm上find

我发现使用PHP更容易。 实际上是在cPanel内创build一个子域,并在所需的域名下创build你的文件夹。 正如你将在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

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

Mod_vhost_alias是正确的模块来做到这一点。

通过一行代码,你可以告诉Apache看到正确的地方,目录散列等。例如,行:

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

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

我认为与Apache的dynamic大容量虚拟主机通配DNS也是一个合理的解决scheme。 虽然,我从来没有尝试过。

如果您需要扩展到多个服务器或其他解决scheme不适合您,我build议使用数据库驱动的DNS服务器。 我过去成功地使用了MyDNS 。 由于它使用MySQL(或PostgreSQL),您可以使用PHP或任何其他方式即时更新您的DNS。 该代码看起来不像它已经在一段时间更新,但它是DNS,因此不完全是前沿。

通配符子域创build方法

首先,您必须使用服务器DNS编辑器创buildDNS设置。

  1. 在服务器IP地址中使用主机*通配符在DNS设置中创buildlogging。

    * 1400 IN A ip_address

  2. 在服务器IP地址中使用host @domain_name.tld再次在DNS设置中创build一条Alogging。 tld表示顶级域名或域名的扩展名,如.com,.org等。

    @ 1400 IN A ip_addressdomain_name.tld 1400 IN A ip_address

  3. 创buildCNAMElogging,如:

    www 1400 IN A domainname.tld

  4. 使用* .domain.tld等*.domain.tld通配符创build子*.domain.tld
  5. *.domain.tld子域目录中创buildhtaccess,并把这个代码:

     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 

    testing你的第一个通配符子域像example.domainname.tld

如果您不想使用htaccess将数据作为parameter passing,则还可以使用以下编码获取数据:

 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_data之类的任何地方使用你的全局variables。

 echo $get_data->data; //example 

(注意:这个类主要用于从http_host得到确切的子域名,因为在你的子域之前结合了一些额外的名字也是可用的,比如www.example.domainname.tld ,这将返回$_GET['data']='wwww'build议使用$_SERVER['http_host']获取确切的值,而不是在索引页中使用$_SERVER['http_host'] $_SERVER['query_string']或传递htaccess参数)

6.在TTL-DNS SETTINGS中,加快通配符子域的执行时间N秒。

7.在给定的ttl时间(600 – 10分钟)之后检查子域名,如=> http://abc.domain.tld

(注意:通配符子域名不会覆盖已经存在的子域名,因为优先级总是针对你已经存在的子域名)