我希望创建一个系统,在注册时将在我的网站上为用户帐户区域创建一个子域.
例如johndoe.website.com
我认为这与.htaccess文件有关,可能会重定向到网站上的其他位置?我其实不知道.但任何启动我的信息将不胜感激.
创建注册区域不是问题 - 我已经做了很多次.我只是不确定从哪个子域开始.
您需要在DNS服务器*.website.com上创建通配符域
然后在您的vhost容器中,您还需要指定通配符*.website.com - 这是在DOC中完成的ServerAlias
然后在PHP中提取并验证子域并显示相应的数据
在DNS设置中,您需要创建一个通配符域条目,例如*.example.org
.通配符条目如下所示:
*.example.org. 3600 A 127.0.0.1
接下来在Apache配置中,您需要设置一个vhost容器,该容器在ServerAlias
DOCs指令中指定通配符.一个示例vhost容器:
ServerName server.example.org ServerAlias *.example.org UseCanonicalName Off
然后在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 动态配置的群发虚拟主机手册页上进行了描述.
您可以首先允许每个子域,然后检查子域是否有效.例如:
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通配符之外,您可能想看看Apache的动态群发虚拟主机,这是我过去解决这个问题的方法.
最简单的方法是将所有子域(带通配符*)重定向到指向/ 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上 找到
我发现用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