PHPに各ユーザーのサブドメインを自動的に作成させるには?


162

http://user.mywebsite.comのようなサブドメインを作成するにはどうすればよいですか?どういうわけかhtaccessにアクセスする必要がありますか?実際に純粋なphpコードで作成することは単に可能ですか、それとも外部のスクリプトサーバー側の言語を使用する必要がありますか?

回答者へ:さて、それでは、ホスティングに何らかのDNSアクセスを提供するかどうか尋ねるべきでしょうか?


サブドメインルーティング(answer of Mark)が既にアクティブになっているため、おそらくプロバイダーにDNSアクセスを要求する必要はありません。サブドメインで結果が得られる場合は、ブラウザで試してください。そして、それらを.htaccessファイルでルーティングします。
powtac 2008年

使用できる場合、wildcard subdomainsこれはで実現できます.htaccess。私の解決策を参照してください。
Dan Bray

回答:


135

カスタムAレコードを作成しようとしています。

Aレコードを指定するときにワイルドカードを使用して、次のようなことができると確信しています。

*.mywebsite.com       IN  A       127.0.0.1

127.0.0.1はWebサーバーのIPアドレスです。実際にレコードを追加する方法は、ホストによって異なります。


以下のようにそれをやってhttp://mywebsite.com/userすることは、それはオプションだ場合はセットアップが非常に簡単になります。

次に、次のような.htaccessファイルを追加します。

Options +FollowSymLinks

RewriteEngine On
RewriteRule ^([aA-zZ])$  dostuff.php?username=$1

上記では、ユーザー名はa〜zの文字に制限されています。


サブドメインを取得するための書き換えルールは次のようになります。

RewriteCond %{HTTP_HOST} ^(^.*)\.mywebsite.com
RewriteRule (.*)  dostuff.php?username=%1

1
各サブドメインが別のサーバーから提供されない限り、私は正規名(CNAME)レコードを作成することをお勧めします。 en.wikipedia.org/wiki/List_of_DNS_record_types
theraccoonbear 2008年

サブドメインは見栄えがします。ただし、すべてのサブドメインリクエストが適切に処理されることを確認する必要があるため、設定にはかなりの手間がかかります。これはApacheではひどいことではありませんが、ホストされた環境では注意が必要です。
Mark Biek 08年

@theraccoonbear CNAMEでもワイルドカードを使用できるとすると、それは考えです。
Mark Biek 08年

3
もっと具体的だったはずです。.htaccessは、IISではなくApache用です。IISでURLの書き換えがどのように処理されるのかはわかりませんが、SOに関していくつかの質問があったと思います。
Mark Biek 08年

1
こんにちは、私は上記の手順を実行しましたが、xyz.mydomain.comを実行すると、xyz.mydomain.com / cgi-sys / defaultwebpage.cgiにリダイレクトされます ...上記の手順以外に何かする必要がありますか?
Ashish Rajan

30

後の機能は、ワイルドカードサブドメインと呼ばれます。これにより、サブドメインごとにDNSを設定する必要がなくなり、代わりにリダイレクトにApache Rewriteを使用できます。ここで素晴らしいチュートリアルを見つけることができますが、そこには何千ものチュートリアルがあります。そのチュートリアルから必要なコードは次のとおりです。

<VirtualHost 111.22.33.55>
    DocumentRoot /www/subdomain
    ServerName www.domain.tld
    ServerAlias *.domain.tld
</VirtualHost>

ただし、VirtualHostsを使用する必要があるため、ローカルの.htaccessではなく、サーバーのhttpd.confファイルで設定する必要があります。


共有ホスティングを使用しているため、httpd.confファイルにアクセスできません。私に何ができる?
Webber Depor

23

マークとは少し違う。ドメイン全体を渡し、phpでサブドメインを取得します。

RewriteCond {REQUEST_URI} !\.(png|gif|jpg)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.php?uri=$1&hostName=%{HTTP_HOST}

これは画像を無視し、その他すべてを私のindex.phpファイルにマッピングします。だから私が行くなら

http://fred.mywebsite.com/album/Dance/now

戻る

http://fred.mywebsite.com/index.php?uri=album/Dance/now&hostName=fred.mywebsite.com

次に、私のindex.phpコードで、hostNameからユーザー名を分解します。これは私に素敵なきれいなSEO URLを与えます。


14

上記で説明したように、ワイルドカードDNSをセットアップします。したがって、aレコードは* .yourname.comです。

その後、すべてのサブドメインは実際には同じ場所に移動しますが、PHPは各サブドメインを異なるアカウントとして扱います。

次のコードを使用します。

$url=$_SERVER["REQUEST_URI"];
$account=str_replace(".yourdomain.com","",$url);

このコードは、$account変数をサブドメインと同じに設定するだけです。その後、アカウントに基づいてファイルやその他の情報を取得できます。

これはおそらく上記の方法ほど効率的ではありませんが、BINDへのアクセス権や制限された.htaccessがない場合は、この方法が機能するはずです(ホストがワイルドカードを設定する限り)。

実際にこの方法を使用して、複数企業のeコマースアプリケーションの顧客データベースに接続しますが、同じように機能する場合もあります。


2
これは正解だと思います。opがどのようにPHPがサブドメインを処理するかについて尋ねるのではなく、WebまたはDNS サーバーがサブドメインをどのように扱う かについては尋ねます
セーラム

8

Apacheマス仮想ホスティングを使用できる場合は、.htaccessファイルをいじる必要はありません。

ドキュメントから:

#include part of the server name in the filenames VirtualDocumentRoot /www/hosts/%2/docs

ある意味でそれはあなたの質問の逆です:すべての「サブドメイン」はユーザーです。ユーザーが存在しない場合は、404が返されます。

唯一の欠点は、環境変数DOCUMENT_ROOT使用されているサブディレクトリに正しく設定されておらず、de htconfigのデフォルトのdocument_rootに設定されていることです。


1
私はそれをどのように使うのか本当にわかりません...そして最後に、なぜhtaccessを台無しにしないのですか?
スクータ

6

サブドメインおよびマルチドメインWebアプリ用のシンプルなPHPソリューション

ステップ1.「example.org」を提供するドメイン(またはドメイン)のDNS Aレコードを「*」として提供する

A record => *.example.org
A record => *.example.net

ステップ2.ユーザーがログインを登録または変更するときに、ログインがどこにあるかを確認します。また、これらのログインではドットを避けてください。

ステップ3.次にクエリを確認する

        // Request was http://qwerty.example.org
        $q = explode('.', $_SERVER['HTTP_HOST']);
        /*
            We get following array
            Array
            (
                [0] => qwerty
                [1] => example
                [2] => org
            )
        */

        // Step 4.
        // If second piece of array exists, request was for 
        // SUBDOMAIN which is stored in zero-piece $q[0]
        // otherwise it was for DOMAIN

        if(isset($q[2])) {
            // Find stuff in database for login $q[0] or here it is "qwerty"
            // Use $q[1] to check which domain is asked if u serve multiple domains
        }

?>

このソリューションは異なるドメインに対応する可能性があります

qwerty.example.org
qwerty.example.net 

johnsmith.somecompany.com
paulsmith.somecompany.com

別のドメインで同じニックネームが必要な場合は、ログインを登録するときに、ユーザーが選択したドメインを保存する必要があります。

smith.example.org // Show info about John Smith
smith.example.net // Show info about Paul Smith 

4

[可能性としては] URLの書き換えを行うこともできますが、そうです。ユーザーが追加されたときに独自のサブドメインを取得できるように、DNS設定を制御する必要があります。


4

新しいサブドメインを処理するためのWWWサーバーの構成変更に加えて、コードでDNSレコードを変更する必要があります。したがって、独自のBIND(または同様の)を実行していない限り、ネームサーバープロバイダーの構成にアクセスする方法を理解する必要があります。それらが何らかのAPIを提供しない場合、これはトリッキーになるかもしれません。

更新:はい。レジストラがネームサーバーサービスも提供しているかどうかを確認します(よくあることです)。私はこのオプションをこれまで調べたことがありませんが、ほとんどの消費者レジストラはそうではないと思います。GoDaddy APIとGoDaddy DNS APIを探しましたが、何もできなかったので、プロバイダーのオンラインヘルプをチェックして、それでも質問に答えられない場合は、保留することをお勧めします。彼らのサポートスタッフの。


3

まず、ワイルドカードサブドメインを許可するようにサーバーが構成されていることを確認する必要があります。JustHostでは、手動で名前を付けたサブメインを作成することでそれを実現しました*subdomainsワイルドカードサブドメインのドキュメントルートと呼ばれるフォルダーも指定しました。これを.htaccessサブドメインフォルダーのファイルに追加します。

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.website\.com$
RewriteCond %{HTTP_HOST} ^(\w+)\.website\.com$
RewriteCond %{REQUEST_URI}:%1 !^/([^/]+)/([^:]*):\1
RewriteRule ^(.*)$ /%1/$1 [QSA]

最後に、サブドメインフォルダにフォルダを作成し、サブディレクトリのファイルをそのディレクトリに配置するだけです。


3

これは.htaccess、ワイルドカードサブドメインを許可するようにサーバーが構成されている場合に実現できます。JustHostでは、手動で名前を付けた*サブメインを作成し、サブドメインというフォルダーをワイルドカードサブドメインのドキュメントルートとして指定することで、これを実現しました。これを.htaccessファイルに追加します。

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.website\.com$
RewriteCond %{HTTP_HOST} ^(\w+)\.website\.com$
RewriteCond %{REQUEST_URI}:%1 !^/([^/]+)/([^:]*):\1
RewriteRule ^(.*)$ /%1/$1 [QSA]

最後に、サブドメイン用のフォルダーを作成し、サブドメインファイルを配置します。


1

追加したかったのは、CloudFlare(無料)を使用している場合、そのAPIを使用してDNSを簡単に管理できることです。


0

PHPとHtaccessを使用して動的サブドメインを作成する

(1)ルート.htaccess

このファイルは、ホームページで使用するためにhttp://www.yourwebsite.comhttp://yourwebsite.comにリダイレクトします。yourwebsite_folderへのすべてのサブドメインリダイレクト

RewriteEngine On

RewriteCond %{HTTP_HOST} ^www.yourwebsite.com
RewriteRule (.*) http://yourwebsite.com/$1 [R=301,L]

RewriteCond %{HTTP_HOST} ^yourwebsite\.com $
RewriteCond %{REQUEST_URI} !^/yourwebsite_folder/
RewriteRule (.*) /yourwebsite_folder/$1

RewriteCond %{HTTP_HOST} ^(^.*)\.yourwebsite.com
RewriteCond %{REQUEST_URI} !^/yourwebsite_folder/
RewriteRule (.*) /yourwebsite_folder/$1

(2).htaccessフォルダ内

このファイルはサブドメインのURLを書き換えています。

http://yourwebsite.com/index.php?siteName=9lessons から http://9lessons.yourwebsite.com

Options +FollowSymLinks
RewriteEngine On

RewriteBase /

RewriteRule ^([aA-zZ])$ index.php?siteName=$1
RewriteCond %{HTTP_HOST} ^(^.*)\.yourwebsite.com
RewriteRule (.*) index.php?siteName=%1

その他の.htaccessのヒント:Htaccessファイルのチュートリアルとヒント。

index.php

このファイルには、サブドメイン値を検証する正規表現を使用した単純なPHPコードが含まれています。

<?php
$siteName='';
if($_GET['siteName'] )
{
$sitePostName=$_GET['siteName'];
$siteNameCheck = preg_match('~^[A-Za-z0-9_]{3,20}$~i', $sitePostName);
   if($siteNameCheck)
   {
     //Do something. Eg: Connect database and validate the siteName.
   }
   else
  {
    header("Location: http://yourwebsite.com/404.php");
   }
}
?>
//HTML Code
<!DOCTYPE html>
<html>
<head>
<title>Project Title</title>
</head>
<body>
<?php if($siteNameCheck) { ?>
//Home Page
<?php } else { ?>
//Redirect to Subdomain Page.
<?php } ?>
</body>
</html>

サブドメインフォルダなし

ルートディレクトリ(htdocs / public_html)をプロジェクトディレクトリとして使用している場合は、次の.htaccessファイルを使用します。

Options +FollowSymLinks
RewriteEngine On

RewriteBase /

RewriteCond %{HTTP_HOST} ^www.yourwebsite.com
RewriteRule (.*) http://yourwebsite.com/$1 [R=301,L]

RewriteRule ^([aA-zZ])$ index.php?siteName=$1
RewriteCond %{HTTP_HOST} ^(^.*)\.yourwebsite.com
RewriteRule (.*) index.php?siteName=%1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.