回答:
ServerAlias
DNS設定で、などのワイルドカードドメインエントリを作成する必要があります*.example.org
。ワイルドカードエントリは次のようになります。
*.example.org. 3600 A 127.0.0.1
次にApache構成で、ServerAlias
DOCsディレクティブでワイルドカードを指定するvhostコンテナーをセットアップする必要があります。vhostコンテナーの例:
<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'], '.')
);
マス仮想ホスティングは、質問とは異なり、アプリケーションを強化するのではなく、通常はそれを使用して多くの異なるWebサイトをホストするという点で、上記とは少し異なるスキームです。
私のmod_rewriteベースのマス仮想ホスティング環境については、以前ブログに投稿しましたが、それがたどるルートかどうかを確認できます。もちろん、それぞれのApacheマニュアルページもあります。
Apacheには、私が使用したmod_rewriteメソッドよりもやや柔軟性が低い大量の仮想ホスティングを処理する内部方法もあります。これはすべて、Apache Dynamically Configured Mass Virtual Hostingのマニュアルページで説明されています。
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]);
}
ただし、これにはすべて、ウェブサーバーがすべてのサブドメイン名を受け入れる必要があります。
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)を介して受け入れ可能になります。
数年前にhttp://www.webmasterworld.com/apache/3163397.htmで見つかりました
これを行うには、Mod_vhost_aliasが適切なモジュールです。
1行で、Apacheにディレクトリハッシュなどで適切な場所を見るように指示できます。たとえば、次の行:
VirtualDocumentRoot /http/users/%3.1/%3.2/%3
subdomain.yourdomain.comに対して要求された場合、Apacheにドキュメントルートを/ http / users / s / u / subdomainに設定するように指示します
Apacheのダイナミックマスバーチャルホスティングを使用したワイルドカードDNSも妥当な解決策だと思います。しかし、私はそれを試したことはありません。
複数のサーバーにスケールアウトする必要がある場合、または他のソリューションが機能しない場合は、データベース駆動のDNSサーバーを使用することをお勧めします。私は過去にMyDNSを使用して成功しています。MySQL(またはPostgreSQL)を使用しているので、PHPまたはその他のほぼすべての機能を使用してDNSを即座に更新できます。コードはしばらく更新されていないように見えますが、それはDNSであるため、正確には最先端ではありません。
まず、サーバーのDNSエディターを使用してDNS設定を作成する必要があります。
サーバーのIPアドレスにA
ホスト*
ワイルドカードを使用して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']
、$_SERVER['query_string']
またはでhtaccessのパラメータを渡しますあなたのインデックスページ)
このワイルドカードサブドメインの実行を高速化するには、TTLでN秒を使用します-DNS設定。
7.次のように、指定されたttl時間(600-10分)後にサブドメインを確認します。 http://abc.domain.tld
(注:ワイルドカードサブドメインは既存のサブドメインを上書きしません。既存のサブドメインでは常に最優先であるため)
wildcard subdomains
、これを行うための私の解決策を参照してください.htaccess
。