をsubdomainsのです。.htaccessファイルサポートに対するコミットメント
-
06-09-2019 - |
質問
いをするシステムに登録をsubdomain自分のページのユーザーの口座です。
例えばjohndoe.website.com
ていただきたいと思いますな。htaccessファイルが残念を別の場所は?んが、実際には知らない。がかなる情報も開始いうぞよろしくお願い申し上げます。
作り手の地域の問題でしょうがないことが多い。いかご不明の場のsubdomain.
解決
簡単な概要
- DNS サーバーにワイルドカード ドメイン *.website.com を作成する必要があります。
- 次に、vhost コンテナでワイルドカードも指定する必要があります *.website.com - これは
ServerAlias
DOC - 次に、PHP でサブドメインを抽出して確認し、適切なデータを表示します。
ロングバージョン
1.ワイルドカード DNS エントリを作成する
DNS 設定で、 ワイルドカード ドメイン エントリ のような *.example.org
. 。ワイルドカード エントリは次のようになります。
*.example.org. 3600 A 127.0.0.1
2.vhost にワイルドカードを含める
次に、Apache 構成で、ワイルドカードを指定する vhost コンテナを設定する必要があります。 ServerAlias
DOC 指令。仮想ホストコンテナの例:
<VirtualHost *:80>
ServerName server.example.org
ServerAlias *.example.org
UseCanonicalName Off
</VirtualHost>
3.PHP でどのサブドメインを使用しているかを確認する
次に、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 で説明されています 動的に構成された大規模仮想ホスティングのマニュアル ページ.
他のヒント
あなたは最初の場所ですべてのサブドメインを許可して、サブドメインが有効であるかどうかを確認できます。たとえばます:
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]
これは、サブドメイン(foldername.domain.com)を介して許容されるIN / wwwrootフォルダの全てのサブフォルダことを達成する。
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";
}
これは、.htaccessファイルとは何の関係もないのです。あなたは、サブドメインのDNSレコードおよび仮想ホスティングを設定する必要があります。
Mod_vhost_alias にこれを行うには正しいモジュールです。
1行でApacheを伝えることができます。ディレクトリハッシュなどで、適切な場所を見て たとえば、行:
VirtualDocumentRoot /http/users/%3.1/%3.2/%3
subdomain.yourdomain.com のために要求されたときに/ HTTP /ユーザー/秒/ U /サブドメインのドキュメントルートを設定するようにApacheを言うだろう
私は、Apacheの動的質量仮想ホスティングとワイルドカードDNSも合理的な解決策だと思います。けれども、私はそれを試したことがありません。
あなたが複数のサーバまたは他のソリューションにスケールアウトする必要がある場合は、私はデータベース駆動型DNSサーバを使用することをお勧めします、あなたのために動作しません。私は正常に過去に MyDNSにに使用してきました。それは、MySQL(あるいはPostgreSQLの)を使用しているため、あなたはPHPと、その場で、または単に何かについてのあなたのDNSを更新することができます。コードは、それがしばらく更新されているようには見えませんが、DNS、したがって、まさに最先端ではありません。
ワイルドカードサブドメインの作成方法
まず、サーバーの DNS エディターを使用して DNS 設定を作成する必要があります。
作成する
A
ホストを使用してDNS設定に記録する*
サーバーの IP アドレスにワイルドカードが含まれています。* 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 パラメーターを渡します)
6.このワイルドカード サブドメインの実行を高速化するには、TTL で N 秒を使用します - DNS 設定。
7. => のように、指定した ttl 時間 (600 ~ 10 分) の経過後にサブドメインを確認します。 http://abc.domain.tld
(注記:ワイルドカード サブドメインは、既存のサブドメインをオーバーライドしません。既存のサブドメインが常に最優先されるため)