2011-12-21 6 views
2

私はこの問題について、まだ解決策がなくても解決策をいくつか行っています。共有ホストのPHPファイルのコンテンツを変更する複数のドメイン

次のように設定します。複数のドメインには、www.domainA.comとwww.domainB.comがあります。 両方のドメインは、LAMPサーバー上の同じホスティングフォルダにマップされます。私は、そのフォルダ内のindex.phpファイルが、どのドメインがファイルにアクセスしているのかを知り、SQLからの内容を変えたいと思っています。私。そのドメインに固有の異なるクライアントIDをロードします。

私は$_SERVER['REMOTE_HOST']$_SERVER['HTTP_REFERRER']を調べましたが、後者は信頼できないと明言されています。私は十分に堅牢なソリューションの後です。

.htaccess私はドメインDNS IPの行に沿って何かを考えていました。いくつかの指導を大いに感謝します。

UPDATE:いくつかの解決策が提案されています。予想されるすべてのドメインを含むSQLテーブルが必要です。 TABLEクライアント( 'id_client'、 'client_name'、 'client_url')を呼び出し、このテーブルを照会して 'id_client'を$変数に戻します。

$ _SERVER ['HTTP_HOST']がデータベースのclient_urlと一致する場合、対応するid_clientが返されます。 .htaccessの解決策は - エレガントですが - ファイルを絶えず更新する必要があります。私は可能な限り、PHPとデータベース内のソリューションを維持することをお勧めします。

$ _SERVER ['HTTP_HOST']のどのような状況で失敗しますか?

答えて

2

あなたは本当に?

は、ここでは、コードの例だのclient_id =、http://corz.org/serv/tricks/htaccess2.php

#two domains served from one root.. 
RewriteCond %{HTTP_HOST} domain-one.com 
RewriteCond %{REQUEST_URI} !^/one 
RewriteRule ^(.*)$ one/$1 [L] 

RewriteCond %{HTTP_HOST} domain-two.com 
RewriteCond %{REQUEST_URI} !^two 
RewriteRule ^(.*)$ two/$1 [L] 
から引き出さindex.phpにmodrewrite書き換えdomaina.comでの.htaccess

でこれを達成することができます

状況に合わせて正規表現とルーティングを変更するだけです。

+0

ありがとうございました!はい、私はそれを考えていませんでした。しかし私が言及しなかったのは、(すみません)彼らは公正に隠される必要があるということです。あなたの例では、ユーザーがindex.php?client_id = aをindex.php?client_id = bに変更すると、間違ったサイトが表示されます。これは私が望むほど堅牢ではありません。これを達成するための別の方法について、あなたや他の誰かが考えることができますか? – Tom

+0

@ user1108993 @Andrewこれはmod_rewriteの魔法です!書き換えは隠されています。ユーザは 'domaina.com'を見るが、アプリケーションは'?domain = a'を見るか、またはあなたがそれを書き直すことを選択する。 – Thor

0

これは2つのステップで実行できます。フォルダ /controller.php/Domain/requestedフォルダ/ページ

達成するためにAバーチャルホストファイルをホスティング

:まず各ドメインのバーチャルホストの設定で別名を使用して、あなたはすべての要求に行くようにそれらを指すことができドメインAのために、これは次のようになります。

<VirtualHost *:80> 
    ServerName domainA.com 
    DirectoryIndex index.html index.htm index.php 
    DocumentRoot /var/www/ 

    Alias /pages /var/www/pages/control.php/DomainA 
</VirtualHost> 

その後control.phpは、すべての要求を受け取るだろうとApacheがcontrol.php後にすべてのものを変数$ _SERVER [「PATH_INFO」]を送信します。たとえば、ユーザーがwww.DomainA.com/folder1/pageC.phpに行くと、$ _SERVER ['PATH_INFO']は '/DomainA/folder1/pageC.php'になります。このソリューションが動作するには、動的ページを別のフォルダに分割する必要があります。そうしないと、静的コンテンツの要求はcontrol.phpによって指示され、問題が発生します。このディレクトリ構造は、慎重に行われた場合、ユーザには見えないようにすることができます。

コントロール。PHPは、PHPページで次のようになります。あなたのコードでこれを行うために探している場合は

<?php 
if (isset($_SERVER['PATH_INFO'])) 
{ 
    $path = explode('/', substr($_SERVER['PATH_INFO'], 1)); //substr removes leading slash 
    $domain = array_shift($path); 
    $page = implode('/', $path); //Note: you will want to verify that there is a page name and append 'index.php' if there is not. 
} 

require_once $page; 
?> 
+0

Ravenexに感謝します!これはうまくいきます。一例は非常に高く評価されます - 私はこれまであなたの提案をよく理解していません。ありがとうございました。 – Tom

+0

私はいくつかの例を追加しました。私たちは、ユーザーが1つのメインコントロールページから別のエンドポイントに移動したり、開発環境と本番環境を分けることができるように、私たちが作成したいくつかのFacebookアプリでこのソリューションを使用しています。唯一の制限は、画像や他のコンテンツがコントローラを介して送られるのを避けるためにコンテンツを分離することですが、同じ主体を賢明に使用することは避けることができます。 – Ravenex

+0

これは、ユーザーが/ Control/Viewに行くControl-Model-View環境を作成するために使用することもできます。ページは最初に指定されたコントロールオブジェクトをロードしてすべてのデータを処理し、これにより、ロジック用のコードと表示生成用のコードを簡単に分離することができます。 – Ravenex

1

そして、最も簡単な方法は、ユーザーが使用してサイトにアクセスしているホスト名を返す$_SERVER['HTTP_HOST']をチェックすることです。たとえば、http://www.example.com/.com/にアクセスした場合、$_SERVER['HTTP_HOST']www.exampleA.comを返します。

ルーティングを行うには、既知のホスト名のリストに対してホストをチェックし、変数を使用してそれに基づいてclient_idを割り当てる単純なケースです。

Zend Frameworkのようなフレームワークを使用するのがやや簡単かもしれませんが、この機能はすでにZend_Controller_Router_Route_Hostnameを使用して組み込まれていますが、スタンドアロンのPHPだけで比較的簡単に実装できるはずです。

関連する問題