2017-11-02 5 views
1

私はマルチテナントSaaSアプリケーションを開発しています。各テナントには独自のデータベースがあります。すべてのテナント固有のデータはテナントのデータベースに限定され、他のテナントとそのデータから隔離されています。テナントのデータベースへの接続を可能にする情報を持つテナントのメタデータ辞書を集中管理しています。.htaccessのURL書き換えルールに基づいて異なるデータベースを使用する

各テナントは固有のユーザー名を持っており、abc.domain.com/usernameなどのURL構造を使用してアプリケーションにアクセスできます。私は、URLのユーザー名に応じてテナントデータベースに接続したいと思います。

答えて

0

あなたはindex.phpの中にあなたがリクエストURLを取得し、それを解析するでしょう、そして、すべてのURL

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.+)$ index.php/$1 [NC,L] 

を処理する単一のPHPファイルへのすべてのトラフィックを指示できます。私はこのようにそれをしなかった場合

$uri = $_SERVER['REQUEST_URI']; 
preg_match('|^/([^/]+)|', $uri, $matches); 
$username = $matches[1]; 

は、私はまた、すべての既存のユーザーとそれに対応するデータベース名からなるテーブルと中央のデータベースを持っていると思います。私は対応するデータベース名を見つけるために$ usernameを使用します。

0

urlを書き換えて、テナントをクエリパラメータとして使用することができます。

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^\/]+)/(.*)$ /$2?tenant=$1 [QSA,L] 

これは、あなたが

$tenant = filter_input(INPUT_GET, 'tenant', FILTER_SANITIZE_STRING); 
$metadata = new PDO('pgsql:host=localhost;port=5432;dbname=meta', $user, $pass); 
$tenantdata = new PDO('mysql:host=localhost;dbname=test', $tenant, 
$_SESSION['tenantpass']); 
$tenantdata->prepare('SELECT foo FROM bar'); 
... 
で、このデータベースに接続できるようになります
関連する問題