Symfony динамические субдомены

Я пытаюсь соответствовать субдоменам к идентификатору клиента в симфонии.

т.е. у меня есть customer1.example.com и customer2.example.com

Домены хранятся в таблице.

Когда пользователь переходит к customer1.example.com, я хотел бы получить субдомен, искать доменное имя в базе данных, когда-то подобранной, это затем развернет конфигурацию приложения для того клиента и затем сохранит customer_Id в глобальном атрибуте, таким образом, я буду знать точно, с каким клиентом я имею дело всюду по целому приложению. Виртуальный хост будет иметь соответствующее подстановочное имя сервера.

Вам удалось достигнуть этого, и если так, как? В противном случае любые идеи были бы большой справкой!

Я думаю об использовании фильтра делать это.

:-)

11
задан Flukey 7 June 2010 в 14:46
поделиться

4 ответа

также потребуется установить свой домен как домен с подстановочными знаками, если нет, вам нужно будет вручную создавать каждый поддомен для каждого клиента.

другое решение, которое не так сильно зависит от симфонии, - это использование .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 вы можете проверить, совпадает ли оно с именем пользователя вашего клиента. и позволяют одновременно использовать припаркованные домены для своих клиентов.

Надеюсь, это поможет.

4
ответ дан 3 December 2019 в 11:36
поделиться

Я делаю нечто подобное. Обратите внимание, я не пробовал именно эту установку.

$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();
}
0
ответ дан 3 December 2019 в 11:36
поделиться

Поскольку вы хотите загрузить другое приложение, фильтр не поможет. Просто используйте frontcontroller (index.php) для извлечения поддомена, и, если каталог приложения существует, загрузите приложение (иначе 404). Вы даже можете сохранить идентификатор в конфигурации приложения.

0
ответ дан 3 December 2019 в 11:36
поделиться

Посмотрите на sfDomainRoutePlugin - он делает то, что вы хотите. Однако в его текущей версии вы не получаете функциональность Propel или DoctrineRoute, что означает, что вы должны вручную искать клиента на основе параметра субдомена, возвращаемого плагином. Пример:

app/frontend/config/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 }

app/frontend/modules/customer/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);
}

Это просто пример, но я сам использую похожий подход, и плагин делает то, что рекламируется. Удачи.

Если вы смелый, вы могли бы взглянуть на главу 2 в книге "More with symfony book". Это поможет вам понять код в sfDomainRoutePlugin.

1
ответ дан 3 December 2019 в 11:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: