php自动生成子域代码,使用.htaccess(PHP)快速创build子域

快速破败

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

然后在你的虚拟主机容器中,你也需要指定通配符* .website.com – 这是在ServerAlias DOC中完成的

然后提取并validationPHP中的子域,并显示适当的数据

长版

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

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

*.example.org. 3600 A 127.0.0.1

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

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

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

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文件夹中的每个子文件夹。

我发现使用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设置。

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

* 1400 IN A ip_address

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

@ 1400 IN A ip_address或domain_name.tld 1400 IN A ip_address

创buildCNAMElogging,如:

www 1400 IN A domainname.tld

使用* .domain.tld等*.domain.tld通配符创build子*.domain.tld

在*.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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值