Динамические поддомены Symfony
Я пытаюсь сопоставить поддомены с идентификатором клиента в symfony.
то есть. У меня есть customer1.example.com и customer2.example.com
Домены сохраняются в таблице.
Когда пользователь переходит к customer1.example.com, я хотел бы получить субдомен, найти доменное имя в базе данных, после его сопоставления, затем он будет развертывать конфигурацию приложения для этого клиента, а затем хранить client_Id в глобальный атрибут, поэтому я точно знаю, к какому клиенту я обращаюсь с полным приложением. Виртуальный хост будет иметь соответствующее имя подстановочного сервера.
Вам удалось добиться этого, и если да, то как? Если нет, любые идеи были бы большой помощью!
Я думаю об использовании фильтра для этого.
: -)
Ответы
Ответ 1
также понадобится установить ваш домен в качестве подстановочного домена, если вам не понадобится вручную создавать каждый поддомен на клиент.
другое решение, которое не так сильно зависит от симфонии, использует .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 вы можете проверить, совпадает ли он с вашим именем пользователя вашего клиента. и вы также можете одновременно использовать припаркованные домены для своих клиентов.
Надеюсь, это поможет.
Ответ 2
Поскольку вы хотите загрузить другое приложение, фильтр не поможет. Просто используйте frontcontroller (index.php), чтобы извлечь субдомен, и если каталог приложения существует, загрузите приложение (еще 404). Вы даже можете сохранить идентификатор в конфигурации приложения.
Ответ 3
Я делаю что-то подобное. Заметьте, я не пробовал эту точную настройку.
$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();
}
Ответ 4
Взгляните на 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 }
приложение/интерфейс/модули/клиент/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.