Используйте разные базы данных на основе правила перезаписи URL для .htaccess

Я занимаюсь разработкой мультитенантного приложения SaaS. У каждого арендатора есть своя база данных. Все специфичные для арендатора данные ограничены базой данных арендатора и изолированы от других арендаторов и их данных. У меня есть централизованный словарь метаданных арендаторов с информацией, позволяющей подключаться к базе данных арендаторов.

Каждый арендатор имеет свое уникальное имя пользователя и сможет получить доступ к приложению, используя структуру URL, такую ​​как abc.domain.com/username. Я хотел бы подключиться к базе данных арендаторов в зависимости от имени пользователя в URL.

1

Решение

Вы можете направить весь трафик в один файл php, который обрабатывает все URL

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, чтобы найти соответствующее имя базы данных.

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector