Я пытаюсь сопоставить поддомены с идентификатором клиента в symfony.
т.е. у меня есть customer1.example.com и customer2.example.com
Домены хранятся в таблице.
Когда пользователь переходит к customer1.example.com, я хотел бы получить субдомен, найти доменное имя в базе данных, после его сопоставления он затем разворачивает конфигурацию приложения для этого клиента, а затем сохраняет client_Id в глобальном атрибуте поэтому я точно знаю, с каким клиентом я имею дело с полным приложением. Виртуальный хост будет иметь соответствующее имя сервера подстановочных знаков.
Вам удалось добиться этого, и если да, то как? Если нет, любые идеи были бы большой помощью!
Я думаю об использовании фильтра для этого.
🙂
также вам понадобится установить ваш домен в качестве подстановочного домена, если вам не потребуется вручную создавать каждый поддомен на клиент.
другое решение, которое не так зависит от симфонии, использует .htaccess
<IfModule mod_rewrite.c> Options +FollowSymLinks Options +Indexes RewriteEngine On RewriteBase / RewriteCond %{HTTP_HOST} !www.domain.com$ [NC] RewriteCond %{HTTP_HOST} ^(www.)?([a-z0-9-]+).domain.com [NC] RewriteRule (.*) $1?sub=%2&page=$1&domain=%{HTTP_HOST} [QSA,L] <IfModule>
этот код в основном отправит на запрошенную страницу субдомен, домен и запрашиваемую страницу. то в php вы можете проверить, совпадает ли он с вашим именем пользователя вашего клиента. и вы также можете одновременно использовать припаркованные домены для своих клиентов.
Я надеюсь, что это помогает.
Поскольку вы хотите загрузить другое приложение, фильтр не поможет. Просто используйте frontcontroller (index.php), чтобы извлечь субдомен, и если каталог приложения существует, загрузите приложение (еще 404). Вы даже можете сохранить идентификатор в конфигурации приложения.
Я делаю что-то подобное. Заметьте, я не пробовал эту точную настройку.
$tokens = explode('.', $_SERVER['SERVER_NAME'], 2); $app = $tokens[0] == 'www' ? 'default' : $tokens[0]; //assumes you aren't allowing www.app.example.com, change if you are try { $appConfiguration = ProjectConfiguration::getApplicationConfiguration($app, 'prod', false); } catch(InvalidArgumentException $e) //thrown if app doesn't exist { $fallbackConfiguration = ProjectConfiguration::getApplicationConfiguration('default', 'prod', false); $context = sfContext::createInstance($fallbackConfiguration); $request = $context->getRequest(); $request->setParameter('module', 'default'); //set what route you want an invalid app to go to here $request->setParameter('action', 'invalidApplication'); $context->dispatch(); } if (isset($appConfiguration)) { sfContext::createInstance($appConfiguration)->dispatch(); }
Взгляните на sfDomainRoutePlugin – он делает то, что вы хотите. Однако в его текущей версии вы не получаете функции Propel или DoctrineRoute, что означает, что вы должны вручную искать клиента на основе параметра субдомена, возвращаемого из плагина. Пример:
приложение / интерфейс / конфигурации / routing.yml
# pick up the homepage homepage: url: / class: sfDomainRoute param: { module: homepage, action: index } requirements: sf_host: [www.example.com, example.com] # catch subdomains for customers customer_subdomain: url: / class: sfDomainRoute param: { module: customer, action: index }
страница# pick up the homepage homepage: url: / class: sfDomainRoute param: { module: homepage, action: index } requirements: sf_host: [www.example.com, example.com] # catch subdomains for customers customer_subdomain: url: / class: sfDomainRoute param: { module: customer, action: index }
приложение / интерфейс / модули / клиент / actions.class.php
public function executeIndex(sfWebRequest $request) { // get the subdomain parameter $this->subdomain = $request->getParameter('subdomain'); // retrieve customer (you have to create the retrieveBySubdomain method) $this->customer = CustomerPeer::retrieveBySubdomain($this->subdomain); }
Это всего лишь пример, но я сам использую подобный подход, и плагин делает то, что рекламируется. Удачи.
Если вы предприимчивы, yuo может взглянуть на главу 2 в «More with symfony book». Это поможет вам понять код в sfDomainRoutePlugin.