2013-03-28 1 views
1

사용자를 위해 데이터베이스에있는 하위 도메인과 사용자 정의 도메인 이름을 사용하는 응용 프로그램을 구축 중이므로 요청이 다른 도메인에서 온 경우, 해당 맞춤 URL이 실제로 존재하거나 요청이 하위 도메인에서 오는 경우 데이터베이스에서 확인할 것입니다. 그것이라면 나는 내 물건을한다. 다른 도메인 또는 하위 도메인에서 요청이 왔는지 확인하는 가장 좋은 방법

이 찾고있는 사람이있어이 I의 간단한 예를 고려해

if(is_user_request()) 
{ 
    $url = get_url(); 
    // assuming that get_url() magically decides whether to output .. 
    // a custom domain (http://domain.tld) 
    // or a subdomain's first part (eg. "this".domain.tld) 
} 
else 
{ 
    // otherwise it's not a sub domain nor a custom domain, 
    // so we're dealing with our own main site. 
} 

을 이제 내가 0 담당자를 가지고 있기 때문에, 내가 여기에 "TEH 코드"에 대한 부탁 해요 가정 진행하기 전에. 나는 다음을 수행하는 완전히 작동하는 방법을 가지고있다 :

// hosts 
$hosts = explode('.', $_SERVER['HTTP_HOST']); 

// if there is a subdomain and that's under our $sitename 
if(!empty($hosts[1]) AND $hosts[1] === Config::get('domain_mid_name')) 
{ 
    $url = $hosts[0]; 
    $url_custom = false; 
} 

// if there is no subdomain, but the domain is our $sitename 
elseif(!empty($hosts[0]) AND $hosts[0] === Config::get('domain_mid_name') AND !empty($hosts[1]) AND $hosts[1] !== Config::get('domain_mid_name')) 
    { 
    $url = false; 
    $url_custom = false; 
} 

// otherwise it's most likely that the request 
// came from a entirely different domain name. 
// which means it's probably $custom_site 
else 
{ 
    $url = false; 
    $url_custom = implode('.', $hosts); 
} 

if($url) 
{ 
    return $url; 
} 

if($url_custom) 
{ 
    return $url_custom; 
} 

그러나 나는 이것을하는 더 좋은 방법이있을 것이라고 확신한다. 우선 HTTP_HOST에는 'http : //'가 포함되어 있지 않으므로 수동으로 추가해야하며이 전체 if, else thing이 과도하다고 확신합니다. 그래서, 나보다 똑똑한 사람, 나를 가르쳐주세요.

아, 아니요 ... 사전 정의 된 하위 도메인이 없습니다. 간단한 와일드 카드 * .domain.tld를 설정 했으므로 모든 하위 도메인이 기본 스크립트로 이동합니다. 저는 솔루션 검색을 통해 수작업으로 서브 도메인을 만들 것을 제안하는 수많은 답변을 발견했기 때문에 원격 도메인과 관련이 없기 때문에이 주제를 건너 뛰겠습니다.

답변

1

이미 말한 것처럼 $_SERVER['HTTP_HOST']이 좋습니다.

그러나 코드에 오류가 있습니다. 전송 된 호스트 이름이 2 개 또는 3 개의 구성 요소로 구성되어 있다고 가정하고 있지만 확실하지는 않습니다. 최소한 count($hosts)도 확인해야합니다.

예를 들어 domain.tld를 자신의 사이트에 사용하는 경우 domain.tld이 전송되었는지 먼저 확인하는 것이 좋습니다 (빠른 페이지 반환). 그런 다음 substr($_SERVER['HTTP_HOST']...,-11)==='.domain.tld'인지 확인하고 그렇다면 하위 사이트를 반환합니다 (하위 도메인의 모든 수준에서 작동, 여전히 빠름). 그렇지 않으면 완전히 복구 된 외부 도메인이 사용자에게 전달 되었기 때문에 오류 복구가 필요합니다. 유의할 점은 계층 구조의 최상위에서 일치하는 도메인은 오른쪽 정렬 된 호스트 이름 문자열과 일치한다는 것을 의미합니다.

 .domain.tld | subsite-pattern 
    sub12.domain.tld | MATCH 
    sub12.dumain.tld | NO MATCH 
    sub12domain.tld | NO MATCH 
+0

이것은 좋은 대답입니다. 그리고 속도에 대한 메모도 많이 감사합니다. –

2

$_SERVER['HTTP_HOST']은 웹 서버의 다른 매개 변수를 PHP로 전달하지 않는 한 올바른 방법입니다.

프로토콜의 경우 요청 프로토콜이 이라고 가정하는 대신 http이라고 가정해야합니다. 당신이 array_shift를 사용하고 그러나

$subdomain = array_shift(explode('.', $_SERVER['HTTP_HOST'])); 

을 실행 볼 수있는 하위 도메인을 추출하기위한

은 일반적으로 당신이 어떻게 그것을 할 방법입니다.

관련 문제