Динамические поддомены 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.