根据.htaccess的URL重写规则使用不同的数据库

时间:2017-11-02 10:23:45

标签: php .htaccess url-rewriting

我正在开发一个多租户SaaS应用程序。每个租户都有自己的数据库。所有特定于租户的数据仅限于租户的数据库,并与其他租户及其数据隔离。我确实有集中租户的元数据字典,其中包含允许连接到租户数据库的信息。

每个租户都拥有唯一的用户名,并且可以使用网址结构访问该应用,例如 abc.domain.com/username 。我想根据网址中的用户名连接到租户数据库。

2 个答案:

答案 0 :(得分:0)

您可以将所有流量定向到处理所有网址的单个php文件

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

然后,在index.php中,您将获得请求URL并解析它。

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

如果我这样做,我还会有一个中央数据库,其中包含一个包含所有现有用户及其相应数据库名称的表。我使用$ username来查找相应的数据库名称。

答案 1 :(得分:0)

您可以重写网址以将租户作为查询参数。

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');
...