현재 도메인 받기


140

서버에 내 사이트가 있습니다

http://www.myserver.uk.com

이를 위해 두 개의 도메인이 있습니다.

http://one.com

http://two.com

PHP 현재 도메인을 사용하고 싶지만 사용 $_SERVER['HTTP_HOST']하면이 표시됩니다.

myserver.uk.com

대신에:

one.com or two.com

서버 이름이 아닌 도메인을 어떻게 얻을 수 있습니까?

PHP 버전 5.2가 있습니다.


기본 URl 만 얻을 수 있습니다. 이 세 가지 중 어느 것이 기본입니까?
Code Spy

2
두 도메인이 어떻게 요청을 서버로 '리디렉션'합니까?
xiaofeng.li

1
@infgeoax 아마 프레임 ...
CodeCaster

기본은 myserver.uk.com입니다. 어떻게하면 현재 도메인 이름을 얻을 수 있습니까? 주소 one.com으로 사이트를 열면 myserver.uk.com 대신 one.com을 받고 싶습니다
Tony Evyght

@TonyEvyght 그것이 infgeoax의 요점이며 내가 만들려고하면 에서 연결하는 호스트 이름을 가져와야 합니다$_SERVER['HTTP_HOST'] . 사이트 경우 one.com와는 two.com(I) 프레임을 사용하여 "리디렉션"당신은 실제 도메인을하지 않도록, 페이지 자체는 여전히 myserver.uk.com에서 온다. 에 대한 HTML 소스는 무엇입니까 one.com?
CodeCaster

답변:


175

이것을 사용해보십시오 : $_SERVER['SERVER_NAME']

아니면 파싱

$_SERVER['REQUEST_URI']

apache_request_headers ()


23
-1 :이 답변만으로, 내가보고있는 다른 제안들이 정확히 무엇인지 모릅니다. 확실히, 이것은 나에게 계속 볼 점을 제공하지만, 그 자체로는 이것이 실제로 좋은 대답은 아닙니다 ...
Jasper

4
그냥 print_r (apache_request_headers ()) 그리고 당신은 모든 것을 이해할 것입니다 :)
1/211 1/2

2
@SarahLewis HTTP_X_ORIGINAL_HOST는 사용자가 수정할 수 있으며 신뢰할 수 없습니다. 이것이 항상 문제가되는 것은 아니지만 알아 두어야 할 사항입니다.
wp-overwatch.com

64

가장 좋은 용도는

echo $_SERVER['HTTP_HOST'];

그리고 그것은 다음과 같이 사용될 수 있습니다 :

if (strpos($_SERVER['HTTP_HOST'], 'banana.com') !== false) {
    echo "Yes this is indeed the banana.com domain";
}

아래의이 코드는 키워드가 강조 표시된 구조화 된 HTML 출력에서 ​​$ _SERVER의 모든 변수를 실행 후 바로 정지시키는 좋은 방법입니다. 때로는 어떤 것을 사용 해야할지 잊어 버렸기 때문에 이것이 좋을 것이라고 생각합니다.

<?php
    // Change banana.com to the domain you were looking for..
    $wordToHighlight = "banana.com";
    $serverVarHighlighted = str_replace( $wordToHighlight, '<span style=\'background-color:#883399; color: #FFFFFF;\'>'. $wordToHighlight .'</span>',  $_SERVER );
    echo "<pre>";
    print_r($serverVarHighlighted);
    echo "</pre>";
    exit();
?>

39

를 사용 $_SERVER['HTTP_HOST']하면 (subdomain.) maindomain.extension이 표시됩니다. 가장 쉬운 해결책 인 것 같습니다.

실제로 iFrame을 통해 '리디렉션'하는 경우 도메인을 나타내는 GET 매개 변수를 추가 할 수 있습니다 .

<iframe src="myserver.uk.com?domain=one.com"/>

그런 다음 애플리케이션 전체에서이 데이터를 유지하는 세션 변수를 설정할 수 있습니다.


1
가장 중요한 것은 포트 번호를 포함하므로 나중에 연결할 필요가 없습니다. bsdnoobz가 제안한 phpinfo는 올바른 솔루션을 찾는 데 도움이됩니다.

30

이것을하는 유일한 안전한 방법

이 페이지의 다른 모든 답변에는 알아야 할 보안 관련 사항이 있습니다.

현재 도메인을 검색 할 수있는 유일한 안전한 방법 하는 것입니다 𝓪 𝓼𝓮𝓬𝓾𝓻𝓮 𝓵𝓸𝓬𝓪𝓽𝓲𝓸𝓷의 𝔂𝓸𝓾𝓻𝓼𝓮𝓵𝓯 𝓲𝓷 𝓲𝓽을 𝓼𝓽𝓸𝓻𝓮.

대부분의 프레임 워크는 도메인 저장을 담당하므로 특정 프레임 워크에 대한 설명서를 참조하십시오. 프레임 워크를 사용하지 않는 경우 다음 위치 중 하나에 도메인을 저장하십시오.

+ ------------------------------------------------- --- + ----------------------------------- +
 | 안전한 도메인 저장 방법 | 사용하는 사람 |
+ ------------------------------------------------- --- + ----------------------------------- +
 | 구성 파일 | Joomla, Drupal / Symfony |
 | 데이터베이스 | 워드 프레스 |
 | 환경 변수 | 라 라벨 |
 | 서비스 레지스트리 | 쿠 버네 티스 DNS |
+ ------------------------------------------------- --- + ----------------------------------- +


다음을 사용할 수는 있지만 안전하지 않습니다.

해커는 이러한 변수를 원하는 도메인으로 출력 할 수 있습니다. 이는 캐시 중독 및 간신히 눈에 띄는 피싱 공격으로 이어질 수 있습니다.

$_SERVER['HTTP_HOST']

이것은 해커가 조작 할 수 있는 요청 헤더에서 도메인을 가져옵니다 . 와 같다:

$_SERVER['SERVER_NAME']

이 설정은 Apache 설정 usecanonicalname 을 끄면 더 좋아질 수 있습니다 . 이 경우 $_SERVER['SERVER_NAME']더 이상 임의의 값으로 채워질 수 없으며 안전합니다. 그러나 이것은 기본값이 아니며 일반적인 설정이 아닙니다.


대중적인 시스템에서

다음은 다음 프레임 워크 / 시스템에서 현재 도메인을 얻는 방법입니다.

워드 프레스

$urlparts = parse_url(home_url());
$domain = $urlparts['host'];

WordPress에서 URL을 구성하는 경우 home_url 또는 site_url 또는 다른 URL 함수를 사용하십시오 .

라 라벨

request()->getHost()

request()->getHost기능은 Symfony에서 상속되었으며 2013 CVE-2013-4752 가 패치 된 이후 안전합니다 .

드루팔

설치 관리자는 아직이 보안을 수행하지 않습니다 ( 문제 # 2404259 ). 그러나 Drupal 8에는 신뢰할 수있는 호스트 설정 에 따라 Drupal 설치를 보호 한 후 다음을 사용할 수있는 설명서가 있습니다.

\Drupal::request()->getHost();

다른 프레임 워크

선호하는 프레임 워크에서 현재 도메인을 얻는 방법을 포함하도록이 답변을 자유롭게 편집하십시오. 그렇게 할 때 관련 소스 코드 또는 프레임 워크가 안전하게 작업하고 있는지 확인하는 데 도움이되는 다른 링크를 포함 시키십시오.




추가

착취 사례 :

  1. 봇넷이 잘못된 호스트 헤더를 사용하여 페이지를 지속적으로 요청하면 캐시 포이즈 닝이 발생할 수 있습니다. 결과 HTML에는 공격자 웹 사이트에 대한 링크가 포함되어 사용자를 피싱 할 수 있습니다. 처음에는 악의적 인 링크가 해커에게만 다시 전송되지만 해커가 요청을 충분히 수행하면 악의적 인 버전의 페이지가 다른 사용자에게 배포되는 캐시에 남게됩니다.

  2. 호스트 헤더를 기반으로 데이터베이스에 링크를 저장하면 피싱 공격이 발생할 수 있습니다. 예를 들어 포럼의 사용자 프로필에 대한 절대 URL을 저장한다고 가정 해 봅시다. 해커는 잘못된 헤더를 사용하여 프로필 링크를 클릭하는 모든 사람이 피싱 사이트를 받도록 할 수 있습니다.

  3. 해커가 다른 사용자의 비밀번호 재설정 양식을 작성할 때 악의적 인 호스트 헤더를 사용하는 경우 비밀번호 재설정 중독이 발생할 수 있습니다. 그러면 해당 사용자는 피싱 사이트로 연결되는 비밀번호 재설정 링크가 포함 된 이메일을받습니다.

  4. 더 악의적 인 예가 있습니다.

추가주의 사항 및 참고 사항 :

  • 낸다 UseCanonicalName가 꺼집니다이 $_SERVER['SERVER_NAME']같은 헤더로 채워집니다 $_SERVER['HTTP_HOST']어쨌든 사용하는 것 (플러스 포트). 이것은 Apache의 기본 설정입니다. 당신이나 devops가 이것을 켜면 괜찮습니다-ish-그러나 당신은 실제로 다른 팀이나 앞으로 3 년 동안 사소한 구성으로 보이는 것을 유지하기를 원합니까? -기본값? 이렇게하면 보안이 강화되지만이 설정에 의존하지 않도록주의해야합니다.
  • 그러나 Redhat은 기본적으로 usecanonical을 설정합니다 [ source ].
  • 경우 는 ServerAlias가 가상 호스트 항목에 사용하고, 별칭 도메인을 요청, $_SERVER['SERVER_NAME']현재 도메인을 반환하지 않습니다,하지만 SERVERNAME 지시어의 값을 반환합니다.
  • serverName을 확인할 수 없으면 운영 체제의 호스트 이름 명령이 [source] 위치에 사용됩니다 .
  • 호스트 헤더가 없으면 서버는 usecanonical이 [source] 에있는 것처럼 작동합니다 .
  • 마지막으로 로컬 서버 에서이 문제를 악용하려고 시도했지만 호스트 헤더를 스푸핑 할 수 없었습니다. 이 문제를 해결 한 Apache 업데이트가 있는지 또는 내가 잘못한 것이 확실하지 않습니다. 그럼에도 불구하고이 헤더는 가상 호스트를 사용하지 않는 환경에서 여전히 악용 될 수 있습니다.

리틀 랜트 :

     이 질문은 당면한 보안 문제에 대한 언급없이 수십만 건의 견해를 받았습니다! 이 방법이 아니어야하지만 스택 오버플로 응답이 널리 사용된다고해서 이것이 안전하다는 의미는 아닙니다.




1
home_url과 site_url의 차이점을 언급 할 수 있습니다. wordpress.stackexchange.com/a/50605/13
Volomike

1
워드 프레스 사용자의 경우 +1 subdir에 설치된 경우 검사해야하지만 $urlparts['path']도메인의 루트 디렉토리에 parse_url key : 가 설치되어 있으면 설정되지 않습니다. Else $urlparts['path']는 서브 디렉토리를 리턴합니다.
Jonas Lundman

9

시도하십시오 $_SERVER['SERVER_NAME'].

팁 : 함수를 호출하는 PHP 파일을 작성 phpinfo()하고 "PHP 변수"섹션을 참조하십시오. 우리가 결코 생각하지 않는 유용한 변수가 많이 있습니다.


항상 $ _SERVER를 print_r-ing하고 검색 할 수 있습니다

3

나는 이것이 전적으로 주제에 관한 것이 아니라는 것을 알고 있지만, 내 경험상 현재 URL의 WWW-ness를 변수에 저장하는 것이 유용하다는 것을 알았습니다.

편집 : 또한, 이것이 무엇을 받고 있는지 보려면 아래의 내 의견을 참조하십시오.

"www"를 사용하거나 사용하지 않고 Ajax 호출을 발송할지 여부를 결정할 때 중요합니다.

$.ajax("url" : "www.site.com/script.php", ...

$.ajax("url" : "site.com/script.php", ...

Ajax 호출을 발송할 때 도메인 이름은 브라우저의 주소 표시 줄에있는 것과 일치해야합니다. 그렇지 않으면 콘솔에 Uncaught SecurityError 가 발생합니다.

그래서이 문제를 해결하기 위해이 솔루션을 생각해 냈습니다.

<?php
    substr($_SERVER['SERVER_NAME'], 0, 3) == "www" ? $WWW = true : $WWW = false;

    if ($WWW) {
        /* We have www.example.com */
    } else {
        /* We have example.com */
    }
?>

그런 다음 $ WWW가 참인지 거짓인지에 따라 적절한 Ajax 호출을 실행하십시오.

나는 이것이 사소한 것처럼 들릴지 모르지만 이것은 넘어지기 쉬운 일반적인 문제입니다.


OP는 SERVER_NAME이 아닌 도메인을 명시 적으로 요청했습니다 .
Sebastian G. Marinescu

사실 요즘에는 www 문제에 대해서도 걱정해야합니다.
InfiniteStack

왜? JS에서는를 볼 수 window.location있습니다. PHP에서 당신은 얻었다 SERVER_NAME.
Sebastian G. Marinescu

4
주소 표시 줄에 "site.com"을 입력해도 SERVER_NAME은 "www.site.com"을 반환합니다. 코드 전체에서 SERVER_NAME을 사용하는 경우, 특히 Ajax 호출을 할 때 www / no-www 보안 문제가 발생합니다. 그러나 고급 PHP 프로그래밍에서 귀하의 질문에 대답하기 위해 때로는 PHP가 서버에 HTTP 호출을하는 코드를 동적으로 생성해야합니다. 대상 URL에 "www"가 없으면 페이지에 보안 오류가 발생합니다.
InfiniteStack

알았어 ... 난 그것에 대해 읽고 당신이 맞아요. 따라서 귀하의 답변은 누군가와 관련이있을 수 있습니다. 잘 했어요 :)
Sebastian G. Marinescu

3

모두 parse_url함수를 사용하고 있지만 때로는 사용자가 다른 형식으로 인수를 전달할 수도 있습니다.

이를 해결하기 위해 함수를 만들었습니다. 이것 좀 봐:

function fixDomainName($url='')
{
    $strToLower = strtolower(trim($url));
    $httpPregReplace = preg_replace('/^http:\/\//i', '', $strToLower);
    $httpsPregReplace = preg_replace('/^https:\/\//i', '', $httpPregReplace);
    $wwwPregReplace = preg_replace('/^www\./i', '', $httpsPregReplace);
    $explodeToArray = explode('/', $wwwPregReplace);
    $finalDomainName = trim($explodeToArray[0]);
    return $finalDomainName;
}

URL을 전달하고 도메인을 얻으십시오.

예를 들어

echo fixDomainName('https://stackoverflow.com');

결과를 반환합니다

stackoverflow.com

그리고 어떤 상황에서는 :

echo fixDomainName('stackoverflow.com/questions/id/slug');

그리고 그것은 또한 돌아올 stackoverflow.com것이다.


1
$_SERVER['HTTP_HOST'] 

// 도메인을 얻으려면

$protocol=strpos(strtolower($_SERVER['SERVER_PROTOCOL']),'https') === FALSE ? 'http' : 'https';
$domainLink=$protocol.'://'.$_SERVER['HTTP_HOST'];

// 프로토콜이있는 도메인

$url=$protocol.'://'.$_SERVER['HTTP_HOST'].'?'.$_SERVER['QUERY_STRING'];

// protocol, domain, queryString total ** $ _ SERVER [ 'SERVER_NAME']은 (는) 다중 도메인 호스팅에 신뢰할 수 없습니다!


-2

간단히 시도하십시오.

echo apache_request_headers()[3];
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.