Answers:
ServerAlias
在DNS设置中,您需要创建一个通配符域条目,例如*.example.org
。通配符条目如下所示:
*.example.org. 3600 A 127.0.0.1
接下来,在Apache配置中,您需要设置一个虚拟主机容器,该容器在ServerAlias
DOCs指令中指定通配符。虚拟主机容器示例:
<VirtualHost *:80>
ServerName server.example.org
ServerAlias *.example.org
UseCanonicalName Off
</VirtualHost>
然后,在您的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 动态配置的批量虚拟主机手册页面上进行了描述。
RewriteRule "^/?(.*)" "http://%{HTTP_HOST}/%{HTTP_HOST}/$1" [L,R,NE]
您可以首先允许每个子域,然后检查该子域是否有效。例如:
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服务器接受每个子域名。
除了设置DNS通配符之外,您可能还想看看Apache的Dynamic Mass Virtual Hosting,这是我过去解决此问题的方式
我发现使用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";
}
最简单的方法是重定向所有子域(使用通配符*)以指向您的/ 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)接受。
Mod_vhost_alias是执行此操作的正确模块。
用一行可以告诉Apache查看正确的位置,使用目录哈希等等。例如,该行:
VirtualDocumentRoot /http/users/%3.1/%3.2/%3
会在请求subdomain.yourdomain.com时告诉Apache将文档根目录设置为/ http / users / s / u / subdomain
首先,您必须使用服务器DNS编辑器创建DNS设置。
A
使用*
服务器IP地址中的主机通配符在DNS设置中创建记录。
* 1400 IN A ip_address
再次A
在DNS设置中使用主机@
或domain_name.tld
服务器IP地址创建一条记录。tld表示顶级域名或域名的扩展名,例如.com,.org等。
@ 1400 IN A ip_address
要么
domain_name.tld 1400 IN A ip_address
创建如下CNAME
记录:
www 1400 IN A domainname.tld
*
通配符创建子域,例如*.domain.tld
在您的的子域目录中创建htaccess,*.domain.tld
并将以下代码放入:
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
测试您的第一个通配符子域,例如 example.domainname.tld
如果您不希望使用htaccess将数据作为参数传递,则还可以使用以下编码来获取数据:
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
。
echo $get_data->data; //example
(注意:此类主要用于从中获取确切的子域名,http_host
因为在您的子域之前合并的一些额外名称也适用,例如www.example.domainname.tld
。此返回值,$_GET['data']='wwww'
所以我的建议是使用$_SERVER['http_host']
for获取确切的值,而不是在中使用$_SERVER['query_string']
或传递的htaccess参数您的索引页)
6.加快此通配符子域的执行速度,在TTL-DNS设置中使用N秒。
7.在给定的ttl时间(600-10分钟)后检查子域,例如=> http://abc.domain.tld
(请注意:通配符子域不会覆盖现有子域。因为“优先级”始终是您现有子域的优先级)
wildcard subdomains
,请参阅我的解决方案以在Windows中执行此操作.htaccess
。