.htaccessを使用してその場でサブドメインを作成する(PHP)


122

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

例:johndoe.website.com

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

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

回答:


125

クイックランダウン

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

ロングバージョン

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

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

*.example.org.   3600  A  127.0.0.1

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

次にApache構成で、ServerAlias DOCsディレクティブでワイルドカードを指定するvhostコンテナーをセットアップする必要があります。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 Dynamically Configured Mass Virtual Hostingのマニュアルページで説明されています


あなたが使用できるという条件でwildcard subdomains、これを行うための私の解決策を参照してください.htaccess
Dan Bray

仮想ホストを.htaccessから追加できるとは思わない。セキュリティについても不安になります。2.4から、ホスト名に応じてベースディレクトリを選択できるようになるはずです(ただし、Danの方法にもいくつかの問題があります)。考慮事項:RewriteRule "^/?(.*)" "http://%{HTTP_HOST}/%{HTTP_HOST}/$1" [L,R,NE]
symcbean

これを実装するPHPコードは、webserver uid(sudoを介した専用ユーザーとして実行する必要があります)として実行してはならないことに注意してください
symcbean

12

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

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]);
}

ただし、これにはすべて、ウェブサーバーがすべてのサブドメイン名を受け入れる必要があります。


3
さらに、DNSサーバーがすべてのサブドメイン名を解決する必要があります。
混乱

1
私はこれが他のウェブサイトで行われたのを見ました、確かに彼らは毎回サブドメインを解決する必要はありませんか?
ベン・マクレー

1
まあ、それはあなたが何を意味するかによります。つまり、インターネット上の誰かがfoo.somedomain.comを検索してそれがキャッシュされていない場合は、そのDNSサーバーが解決する必要があります。
混乱

つまり、ドメインごとにDNSレコードを設定する必要がありますか。トレフィノンの回答を参照してください。
混乱

大丈夫、ありがとう。仮想ホストでワイルドカードを指定してトレフィノンが何を意味するのかよくわかりませんか?
ベン・マクレー


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

}

cPanelで正常に作成されたかどうかを確認し、FTP(またはファイルマネージャー)でpublic_html / subdomainフォルダー内の内容を確認します。サブドメインを作成するときにcPanel設定を追加する場合、これはオンザフライでのサブドメインの作成とは関係ありません。
エイドリアン

いいえcPanelで作成されていません
ルチ

次に、cPanelに対する十分な権限がありません。この共有ホスティングVPSまたは専用サーバーですか?
エイドリアンP.

サブドメインを作成しない理由はいくつか考えられます。上記のスクリプトとは関係ありませんが、DNS構成を使用します。それを読んで、cPanelフォーラムで助けを求めてください。forums.cpanel.net/threads/subdomains-not-working.228132
Adrian P.

5

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


4

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


4

これを行うには、Mod_vhost_aliasが適切なモジュールです。

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

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

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


0

Apacheのダイナミックマスバーチャルホスティングを使用したワイルドカードDNSも妥当な解決策だと思います。しかし、私はそれを試したことはありません。

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


0

ワイルドカードサブドメインの作成方法

まず、サーバーのDNSエディターを使用してDNS設定を作成する必要があります。

  1. サーバーのIPアドレスにAホスト*ワイルドカードを使用してDNS設定にレコードを作成します。

    * 1400 IN A ip_address

  2. AホストのDNS設定@またはdomain_name.tldサーバーのIPアドレスにもう一度レコードを作成します。tldは、トップレベルドメインまたは.com、.orgなどのドメインの拡張子を意味します...

    @ 1400 IN A ip_address または domain_name.tld 1400 IN A ip_address

  3. 次のCNAMEようなレコードを作成します。

    www 1400 IN A domainname.tld

  4. 次の*ようなワイルドカードを使用してサブドメインを作成します*.domain.tld
  5. のサブドメインディレクトリに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

(注:ワイルドカードサブドメインは既存のサブドメインを上書きしません。既存のサブドメインでは常に最優先であるため)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.