我正在尝试将子域名与symfony中的客户ID匹配。
即。我有customer1.example.com和customer2.example.com
域名存储在表格中。
当用户访问customer1.example.com时,我想获取子域名,在数据库中查找域名,一旦匹配,它将为该客户部署应用程序配置,然后将customer_Id存储在一个全局属性,所以我确切地知道我正在处理整个应用程序的客户。虚拟主机将具有相关的通配符服务器名称。
你有没有成功实现这一目标,如果是,如何实现?如果没有,任何想法都将是一个很大的帮助!
我正在考虑使用过滤器来完成它。
: - )
答案 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();
}