125

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

例: johndoe.website.com

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

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

4

9 に答える 9

126

簡単な概要

  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 にワイルドカードを含める

ServerAlias 次に、Apache 構成で、 DOCsディレクティブでワイルドカードを指定する vhost コンテナーをセットアップする必要があります。仮想ホスト コンテナーの例:

<VirtualHost *:80>
  ServerName server.example.org
  ServerAlias *.example.org
  UseCanonicalName Off
</VirtualHost>

3. PHP で使用しているサブドメインを確認する

$_SERVER次に、PHP スクリプトで、スーパー グローバル変数を調べることでドメインを見つけることができます。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 マニュアル ページで説明されています。

于 2009-02-25T14:21:06.967 に答える
13

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

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

于 2009-02-25T14:18:16.397 に答える
7

DNS ワイルドカードの設定に加えて、私が過去にこれを解決した方法であるDynamic Mass Virtual Hosting for Apacheをご覧になることをお勧めします。

于 2009-02-25T14:38:43.053 に答える
6

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

}
于 2013-02-13T01:55:50.403 に答える
4

Mod_vhost_aliasは、これを行うための適切なモジュールです。

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

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

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

于 2009-04-14T11:20:22.320 に答える
4

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

于 2009-02-25T14:17:23.807 に答える
0

Apache の Dynamic Mass Virtual Hosting を使用したワイルドカード DNS も妥当なソリューションだと思います。とはいえ、私は試したことはありません。

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

于 2009-02-25T15:13:18.010 に答える