Ben*_*Rae 121 php subdomain dns .htaccess virtualhost
我希望创建一个系统,在注册时将在我的网站上为用户帐户区域创建一个子域.
例如johndoe.website.com
我认为这与.htaccess文件有关,可能会重定向到网站上的其他位置?我其实不知道.但任何启动我的信息将不胜感激.
创建注册区域不是问题 - 我已经做了很多次.我只是不确定从哪个子域开始.
Tre*_*non 123
ServerAlias 在DNS设置中,您需要创建一个通配符域条目,例如*.example.org.通配符条目如下所示:
*.example.org. 3600 A 127.0.0.1
Run Code Online (Sandbox Code Playgroud)
接下来在Apache配置中,您需要设置一个vhost容器,该容器在ServerAlias DOCs指令中指定通配符.一个示例vhost容器:
<VirtualHost *:80>
ServerName server.example.org
ServerAlias *.example.org
UseCanonicalName Off
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
然后在PHP脚本中,您可以通过查看$_SERVER超级全局变量来查找域.以下是在PHP中抓取子域的示例:
preg_match('/([^.]+)\.example\.org/', $_SERVER['SERVER_NAME'], $matches);
if(isset($matches[1])) {
$subdomain = $matches[1];
}
Run Code Online (Sandbox Code Playgroud)
我在这里使用了正则表达式,允许人们通过www.subdomain.example.org或subdomain.example.org访问您的网站.
如果你从未预料到必须处理www.(或其他子域)那么您可以简单地使用子字符串,如下所示:
$subdomain = substr(
$_SERVER['SERVER_NAME'], 0,
strpos($_SERVER['SERVER_NAME'], '.')
);
Run Code Online (Sandbox Code Playgroud)
大规模虚拟主机与上述方案略有不同,因为您通常会使用它来托管许多不同的网站,而不是尝试使用它为问题提出的应用程序提供支持.
我之前在博客上的帖子中记录了我的基于mod_rewrite的大规模虚拟主机环境,如果这是你想要的路线,你可以看一下.当然,还有相应的Apache手册页.
Apache还有一种处理大规模虚拟主机的内部方法,它比我使用的mod_rewrite方法稍微灵活一些.这些都在Apache 动态配置的群发虚拟主机手册页上进行了描述.
Gum*_*mbo 12
您可以首先允许每个子域,然后检查子域是否有效.例如:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^[^.]+\.example\.com$
RewriteRule !^index\.php$ index.php [L]
Run Code Online (Sandbox Code Playgroud)
在里面index.php你可以使用除提取的子域:
if (preg_match('/^([^.]+)\.example\.com$/', $_SERVER['HTTP_HOST'], $match)) {
var_dump($match[1]);
}
Run Code Online (Sandbox Code Playgroud)
但所有这些都要求您的网络服务器接受每个子域名.
除了设置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]
Run Code Online (Sandbox Code Playgroud)
这将完成/ 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";
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
61962 次 |
| 最近记录: |