Symfony动态子域

时间:2010-06-07 12:40:50

标签: php symfony1 filter subdomain

我正在尝试将子域名与symfony中的客户ID匹配。

即。我有customer1.example.com和customer2.example.com

域名存储在表格中。

当用户访问customer1.example.com时,我想获取子域名,在数据库中查找域名,一旦匹配,它将为该客户部署应用程序配置,然后将customer_Id存储在一个全局属性,所以我确切地知道我正在处理整个应用程序的客户。虚拟主机将具有相关的通配符服务器名称。

你有没有成功实现这一目标,如果是,如何实现?如果没有,任何想法都将是一个很大的帮助!

我正在考虑使用过滤器来完成它。

: - )

4 个答案:

答案 0 :(得分: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中,您可以检查它是否等于您的客户端用户名。并允许您同时为您的客户使用托管域名。

我希望它有所帮助。

答案 1 :(得分:1)

看看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);
}

这只是一个例子,但我自己也使用了类似的方法,插件会做广告宣传。祝你好运。

如果你喜欢冒险,你可以看看“更多与symfony书”中的第2章。这有助于您理解sfDomainRoutePlugin中的代码。

答案 2 :(得分:0)

因为您要加载不同的应用,过滤器无济于事。只需使用frontcontroller(index.php)提取子域,如果app目录存在,则加载应用程序(否则为404)。您甚至可以将ID存储在应用配置中。

答案 3 :(得分:0)

我正在做类似的事情。请注意,我没有尝试过这种确切的设置。

$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();
}