web-dev-qa-db-ja.com

.htaccessを使用して、オンザフライでサブドメインを作成します(PHP)

サインアップ時に、ユーザーアカウントエリア用にWebサイトにサブドメインを作成するシステムを作成したいと考えています。

例えばjohndoe.website.com

私はそれが.htaccessファイルと何か関係があると思いますし、おそらくウェブサイト上の別の場所にリダイレクトしますか?私は実際には知りません。しかし、私を始めるための情報は大歓迎です。

サインアップエリアを作成することは問題ではありません。これを何度も行いました。サブドメインでどこから始めればいいのかわかりません。

121
Ben McRae

クイックランダウン

  1. DNSサーバー* .website.comにワイルドカードドメインを作成する必要があります
  2. 次に、vhostコンテナーでワイ​​ルドカードも指定する必要があります* .website.com-これは ServerAlias DOC
  3. 次に、PHPのサブドメインを抽出して確認し、適切なデータを表示します

ロングバージョン

1.ワイルドカードDNSエントリを作成します

DNS設定で、*.example.orgなどの ワイルドカードドメインエントリ を作成する必要があります。ワイルドカードエントリは次のようになります。

*.example.org.   3600  A  127.0.0.1

2. vhostにワイルドカードを含める

次にApache構成で、 ServerAliasでワイルドカードを指定するvhostコンテナを設定する必要があります DOC ディレクティブ。 vhostコンテナの例:

<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 動的に設定された大容量仮想ホスティングマニュアルページ で説明されています。

122
Treffynnon

最初にすべてのサブドメインを許可してから、サブドメインが有効かどうかを確認できます。例えば:

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サーバーがすべてのサブドメイン名を受け入れる必要があります。

12
Gumbo

DNSワイルドカードの設定に加えて、 Apacheのダイナミックマスバーチャルホスティング をご覧になることをお勧めします。これは過去にこれを解決した方法です

7
Rowland Shaw

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";

}
5
Adrian P.

最も簡単な方法は、/ 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 で見つかりました

5
Glavić

Mod_vhost_alias はこれを行うための正しいモジュールです。

1行で、Apacheにディレクトリハッシュなどを使用して適切な場所を見るように指示できます。たとえば、次の行

VirtualDocumentRoot /http/users/%3.1/%3.2/%3

subdomain.yourdomain.comに対して要求されたときに、ドキュメントルートを/ http/users/s/u/subdomainに設定するようにApacheに指示します。

4
Julien Tartarin

.htaccessとは何の関係もありません。サブドメインのDNSレコードと仮想ホスティングを設定する必要があります。

4
chaos

ApacheのDynamic Mass Virtual Hostingを使用したワイルドカードDNSも合理的なソリューションだと思います。しかし、私はそれを試したことがない。

複数のサーバーにスケールアウトする必要がある場合、または他のソリューションがうまく機能しない場合は、データベース駆動のDNSサーバーを使用することをお勧めします。過去に MyDNS を使用しました。 MySQL(またはPostgreSQL)を使用しているため、PHPなど)を使用してDNSをオンザフライで更新できます。コードはしばらく更新されたようには見えませんが、 DNS。したがって、エッジを正確に切断しません。

0
Barrett Conrad