2010-06-07 5 views
11

symfony에서 하위 도메인을 고객 ID와 일치 시키려고합니다. 제가Symfony 동적 하위 도메인

customer1.example.com 및 customer2.example.com

도메인 테이블에 저장되어있다, 즉

.

사용자가 customer1.example.com으로 이동하면 하위 도메인을 가져 와서 데이터베이스에서 도메인 이름을 검색하고 일치하면 해당 고객의 앱 구성을 배포 한 다음 customer_Id를 저장합니다. 글로벌 속성에서 나는 정확히 모든 고객이 전체 응용 프로그램을 처리하고 있음을 알고 있습니다. 가상 호스트에는 관련 와일드 카드 servername이 있습니다.

달성 할 수 있었습니까? 그렇다면 어떻게해야합니까? 그렇지 않다면 어떤 아이디어라도 큰 도움이 될 것입니다!

나는 그것을하기 위해 필터를 사용하려고 생각하고 있습니다.

:-)

+1

+1 좋은 질문 :-) – richsage

+0

감사합니다! 다행히 누군가 대답을 알고 있습니다! :-) – Flukey

답변

3

또한 와일드 카드 도메인으로 도메인을 설정해야합니다. 그렇지 않으면 클라이언트마다 수동으로 각 하위 도메인을 만들어야합니다. 의존 그래서 교향곡하지

다른 해결책은 기본적으로 요청 된 페이지에 하위 도메인, 도메인 및 요청하신 페이지를 보내드립니다 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에서 클라이언트 사용자 이름과 동일한 지 확인할 수 있습니다. 동시에 고객을 위해 파킹 된 도메인을 사용할 수도 있습니다.

도움이되기를 바랍니다.

0

다른 앱을로드하려고하므로 필터가 도움이되지 않습니다. frontcontroller (index.php)를 사용하여 하위 도메인을 추출하고 앱 디렉토리가 존재하면 앱을로드하십시오 (else 404). 앱 구성에 ID를 저장할 수도 있습니다.

+0

안녕 마렉. 나는 다른 응용 프로그램을 배포하지 않고 단지 sudomain을 매개 변수 변수로 사용하려고합니다. 예 : http://example.com/company1/admin 대신 http://company1.example.com/admin을 사용하고 싶습니다. 모든 고객에게 동일한 앱이지만 하위 도메인을 사용하고 있습니다. 관련 데이터를 얻으십시오. 어제 밤 성공할 수있었습니다. 필터 (domainMatchFilter.class.php)를 만들었습니다. – Flukey

+0

나는 서브 도메인을 움켜 잡고 고객 테이블에서 도메인과 일치하는 검색을 수행했습니다 (테이블의 도메인 필드에 인덱스가 있음). 일단 발견되면 결과 집합의 고객 개체로 구성 변수를 설정합니다. 즉 sfConfig :: set ("customer", $ customer)입니다. 고객이 없으면 홈페이지 (example.com)로 리디렉션됩니다. 이 고객이 존재하지 않는다는 등의 페이지로 리디렉션하는 것이 더 좋을 것이라고 생각하십니까? 이 필터는 매번 데이터베이스를 쿼리하기 때문에 약간 느린 모든 페이지 요청에서 실행되지만, 어떻게해야 하는지를 알 수있는 유일한 방법입니다. – Flukey

+0

uservoice.com처럼 작동하고 싶습니다. 가입하고 자신의 도메인 (예 : company1.uservoice.com 등)을 얻습니다. 이는 uservoice.com/company1보다 훨씬 좋음 – Flukey

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

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

이 그냥 예입니다,하지만 난 비슷한 접근법을 직접 사용하고, 플러그인은 광고되는 것을 수행합니다. 행운을 빕니다.

모험을 즐기는 사람이라면 "심포니와 함께하는 더 많은 책"에서 2 장을 살펴볼 수 있습니다. 이렇게하면 sfDomainRoutePlugin의 코드를 이해하는 데 도움이됩니다.