.htaccess (PHP)를 사용하여 즉시 하위 도메인 생성


122

가입시 내 웹 사이트에 사용자 계정 영역에 대한 하위 도메인을 만드는 시스템을 만들려고합니다.

예 : johndoe.website.com

.htaccess 파일과 관련이 있으며 웹 사이트의 다른 위치로 리디렉션 될 수 있다고 생각합니까? 나는 실제로 모른다. 그러나 나를 시작하는 모든 정보는 크게 감사하겠습니다.

가입 영역을 만드는 것은 문제가 아닙니다.이 작업을 여러 번 해왔습니다. 하위 도메인으로 시작해야 할 곳이 확실하지 않습니다.

답변:


125

빠른 요약

  1. DNS 서버 * .website.com에 와일드 카드 도메인을 만들어야합니다.
  2. 그런 다음 가상 호스트 컨테이너에서 와일드 카드도 지정해야합니다. * .website.com-이것은 DOC 에서 수행됩니다.ServerAlias
  3. 그런 다음 PHP에서 하위 도메인을 추출 및 확인하고 적절한 데이터를 표시합니다.

긴 버전

1. 와일드 카드 DNS 항목 만들기

DNS 설정에서 와 같은 와일드 카드 도메인 항목 을 만들어야합니다 *.example.org. 와일드 카드 항목은 다음과 같습니다.

*.example.org.   3600  A  127.0.0.1

2. vhost에 와일드 카드 포함

다음으로 Apache 구성에서 ServerAlias DOC 지시문에 와일드 카드를 지정하는 가상 호스트 컨테이너를 설정해야합니다 . 가상 호스트 컨테이너의 예 :

<VirtualHost *:80>
  ServerName server.example.org
  ServerAlias *.example.org
  UseCanonicalName Off
</VirtualHost>

3. PHP에서 어떤 하위 도메인에 있는지 확인

그런 다음 PHP 스크립트에서 $_SERVERsuper 전역 변수를 살펴봄으로써 도메인을 찾을 수 있습니다 . 다음은 PHP에서 하위 도메인을 가져 오는 예입니다.

preg_match('/([^.]+)\.example\.org/', $_SERVER['SERVER_NAME'], $matches);
if(isset($matches[1])) {
    $subdomain = $matches[1];
}

www.subdomain.example.org 또는 subdomain.example.org를 통해 사이트를 방문하는 사람들을 허용하기 위해 여기에서 정규식을 사용했습니다.

www. (또는 다른 하위 도메인) 다음과 같이 간단히 하위 문자열을 사용할 수 있습니다.

$subdomain = substr(
                 $_SERVER['SERVER_NAME'], 0,
                 strpos($_SERVER['SERVER_NAME'], '.')
             );

대량 가상 호스팅

대량 가상 호스팅은 질문에서 제안한대로 응용 프로그램에 전원을 공급하기보다는 일반적으로 많은 별개의 웹 사이트를 호스팅하는 데 사용한다는 점에서 위와 약간 다른 방식입니다.

이전 에 내 블로그에 게시 된 게시물에서 mod_rewrite 기반 대량 가상 호스팅 환경을 문서화 했습니다. 이것이 원하는 경로인지 살펴볼 수 있습니다. 물론 각각의 Apache 매뉴얼 페이지도 있습니다.

Apache는 또한 내가 사용한 mod_rewrite 방법보다 약간 덜 유연한 대량 가상 호스팅을 처리하는 내부 방법을 가지고 있습니다. 이것은 모두 Apache Dynamically Configured Mass Virtual Hosting 매뉴얼 페이지에 설명되어 있습니다.


사용할 수 wildcard subdomains있다면 내 솔루션을 참조하십시오 .htaccess.
Dan Bray

htaccess에서 가상 호스트를 추가 할 수 있다고 생각하지 않아 보안에 대해 신경이 쓰이게합니다. 2.4부터 호스트 이름에 의존하는 기본 디렉토리를 선택할 수 있어야합니다 (하지만 Dan의 방법에도 몇 가지 문제가 있습니다) 고려 :RewriteRule "^/?(.*)" "http://%{HTTP_HOST}/%{HTTP_HOST}/$1" [L,R,NE]
symcbean

이를 구현하는 PHP 코드는 웹 서버 uid로 실행하면 안됩니다 (sudo를 통한 전용 사용자 여야 함)
symcbean

12

먼저 모든 하위 도메인을 허용 한 다음 하위 도메인이 유효한지 확인할 수 있습니다. 예를 들면 :

RewriteEngine on
RewriteCond %{HTTP_HOST} ^[^.]+\.example\.com$
RewriteRule !^index\.php$ index.php [L]

내부에서 index.php다음을 사용하여 하위 도메인을 추출 할 수 있습니다.

if (preg_match('/^([^.]+)\.example\.com$/', $_SERVER['HTTP_HOST'], $match)) {
    var_dump($match[1]);
}

그러나이 모든 것은 웹 서버가 모든 하위 도메인 이름을 허용해야합니다.


3
또한 DNS 서버가 모든 하위 도메인 이름을 확인해야합니다.
chaos

1
다른 웹 사이트에서이 작업이 수행되는 것을 본 적이 있는데, 매번 모든 하위 도메인을 확인할 필요가 없습니다.
Ben McRae

1
글쎄, 그것은 당신이 의미하는 바에 달려 있습니다. 즉, 인터넷의 누군가가 foo.somedomain.com을 조회하고 캐시되지 않을 때마다 DNS 서버가이를 해결해야합니다.
chaos

즉, 각 도메인에 대해 특별히 DNS 레코드를 설정해야합니까? Treffynnon의 답변을 참조하십시오.
chaos

그래, 고마워. vhost에서 와일드 카드를 지정하여 Treffynnon이 무엇을 의미하는지 잘 모르겠습니다.
Ben McRae


6

PHP로하는 것이 더 쉽다는 것을 알았습니다. 실제로 cPanel 내에 하위 도메인을 만들고 원하는 도메인 이름으로 폴더를 만듭니다. cPanel에서 수동으로 수행 하겠지만 모든 작업은 간단한 PHP 함수로 밀리 초 내에 수행됩니다. 클릭 할 필요 없음 :)

function create_subdomain($subDomain,$cPanelUser,$cPanelPass,$rootDomain) {

    //  $buildRequest = "/frontend/x3/subdomain/doadddomain.html?rootdomain=" . $rootDomain . "&domain=" . $subDomain;

    $buildRequest = "/frontend/x3/subdomain/doadddomain.html?rootdomain=" . $rootDomain . "&domain=" . $subDomain . "&dir=public_html/subdomains/" . $subDomain;

    $openSocket = fsockopen('localhost',2082);
    if(!$openSocket) {
        return "Socket error";
        exit();
    }

    $authString = $cPanelUser . ":" . $cPanelPass;
    $authPass = base64_encode($authString);
    $buildHeaders  = "GET " . $buildRequest ."\r\n";
    $buildHeaders .= "HTTP/1.0\r\n";
    $buildHeaders .= "Host:localhost\r\n";
    $buildHeaders .= "Authorization: Basic " . $authPass . "\r\n";
    $buildHeaders .= "\r\n";

    fputs($openSocket, $buildHeaders);
        while(!feof($openSocket)) {
           fgets($openSocket,128);
        }
    fclose($openSocket);

    $newDomain = "http://" . $subDomain . "." . $rootDomain . "/";

   //  return "Created subdomain $newDomain";

}

cPanel에서 성공적으로 생성되었는지 확인하고, FTP (또는 파일 관리자)로 public_html / subdomain 폴더 안에 무엇이 있는지 확인하십시오. 하위 도메인을 만들 때 항목을 추가하는 cPanel 설정이있는 경우 이는 즉석에서 하위 도메인을 만드는 것과 관련이 없습니다.
Adrian P.

아니오의 cPanel에서 생성되지 않은
RUCHI

그렇다면 cPanel에 대한 충분한 권한이 없습니다. 이 공유 호스팅 VPS 또는 전용 서버입니까?
Adrian P.

하위 도메인을 생성하지 않는 이유는 여러 가지 일 수 있습니다. 위의 스크립트와 관련이 없지만 DNS 구성과 관련이 있습니다. 그것을 읽고 cPanel 포럼에서 도움을 요청하십시오. forums.cpanel.net/threads/subdomains-not-working.228132
아드리안 P.

5

가장 쉬운 방법은 / wwwroot를 가리 키도록 모든 하위 도메인 (와일드 카드 * 사용)을 리디렉션하는 것입니다. 그런 다음 다음 코드를 사용하여 .htaccess를이 폴더에 넣습니다.

RewriteCond %{ENV:REDIRECT_SUBDOMAIN} ="" 
RewriteCond %{HTTP_HOST} ^([a-z0-9][-a-z0-9]+)\.domain\.com\.?(:80)?$ [NC] 
RewriteCond %{DOCUMENT_ROOT}/%1 -d 
RewriteRule ^(.*) %1/$1 [E=SUBDOMAIN:%1,L] 
RewriteRule ^ - [E=SUBDOMAIN:%{ENV:REDIRECT_SUBDOMAIN},L]

이렇게하면 / wwwroot 폴더의 모든 하위 폴더가 하위 도메인 (foldername.domain.com)을 통해 허용됩니다.

몇 년 전에 http://www.webmasterworld.com/apache/3163397.htm 에서 찾았습니다 .


4

.htaccess와는 관련이 없습니다. 하위 도메인에 대한 DNS 레코드 및 가상 호스팅을 설정해야합니다.


4

Mod_vhost_alias 는이를 수행하는 데 적합한 모듈입니다.

한 줄로 Apache에게 디렉토리 해싱 등으로 올바른 위치를 찾도록 지시 할 수 있습니다. 예를 들면 다음과 같습니다.

VirtualDocumentRoot /http/users/%3.1/%3.2/%3

subdomain.yourdomain.com에 대해 요청되면 Apache에 문서 루트를 / http / users / s / u / subdomain으로 설정하도록 지시합니다.


0

Apache의 Dynamic Mass Virtual Hosting을 사용하는 와일드 카드 DNS도 합리적인 솔루션이라고 생각합니다. 비록 나는 그것을 시도한 적이 없습니다.

여러 서버로 확장해야하거나 다른 솔루션이 작동하지 않는 경우 데이터베이스 기반 DNS 서버를 사용하는 것이 좋습니다. 과거에 MyDNS 를 성공적으로 사용 했습니다 . MySQL (또는 PostgreSQL)을 사용하기 때문에 PHP 또는 그 밖의 모든 것을 사용하여 즉석에서 DNS를 업데이트 할 수 있습니다. 코드는 한동안 업데이트 된 것처럼 보이지 않지만 DNS이므로 정확히 최첨단이 아닙니다.


0

와일드 카드 하위 도메인 생성 방법

먼저 서버 DNS 편집기를 사용하여 DNS 설정을 만들어야합니다.

  1. 서버 IP 주소의 A호스트 *와일드 카드를 사용하여 DNS 설정에서 레코드를 만듭니다 .

    * 1400 IN A ip_address

  2. A호스트 @또는 domain_name.tld서버 IP 주소를 사용하여 DNS 설정에서 다시 한 번 레코드를 만듭니다 . tld는 최상위 도메인 또는 .com, .org 등과 같은 도메인의 확장을 의미합니다.

    @ 1400 IN A ip_address 또는 domain_name.tld 1400 IN A ip_address

  3. 다음 CNAME과 같이 레코드를 만듭니다 .

    www 1400 IN A domainname.tld

  4. 다음과 *같은 와일드 카드를 사용 하여 하위 도메인을 만듭니다.*.domain.tld
  5. 의 하위 도메인 디렉토리에 htaccess를 *.domain.tld만들고 다음 코드를 넣으십시오.

    Options +FollowSymLinks 
    RewriteEngine On 
    RewriteBase /
    RewriteRule ^([aA-zZ0-9]+)$ index.php?data=$1
    RewriteCond %{HTTP_HOST} ^([aA-zZ0-9]+)\.([aA-zZ0-9-]+)\.([aA-zZ]+)
    RewriteRule ([aA-zZ0-9]+) index.php?data=%1

    다음과 같이 첫 번째 와일드 카드 하위 도메인을 테스트하십시오. example.domainname.tld

htaccess를 사용하여 데이터를 매개 변수로 전달하는 데 관심이없는 경우 다음 코딩을 사용하여 데이터를 가져올 수도 있습니다.

define("SUBDOMAIN_PARENT","domainname.tld");   
class getData
    {
         function __construct()
        {
            $this->data="";
            $http_host=$_SERVER['HTTP_HOST'];
         $subdom_data= str_replace(SUBDOMAIN_PARENT,"",$http_host);
         $expl_subdom_data=explode(".",$subdom_data);
      $expl_subdom_data=array_filter($expl_subdom_data);

            if($expl_subdom_data!=NULL)
            {
           $this->data=end($expl_subdom_data);
            }
       }
    }
$GLOBALS['get_data']=new getData();

와 같은 곳에서 전역 변수를 사용하십시오 global $get_data.

echo $get_data->data; //example

(참고 : 주로 사용되는이 클래스에서 정확한 subdomainname을 얻을 http_host하위 도메인 이전에 결합 된 몇 가지 여분의 이름도 같이 적용 할 수 있기 때문이다. www.example.domainname.tld이 수익을. $_GET['data']='wwww'내 제안은을 사용하는 것입니다 그래서 $_SERVER['http_host']정확한 값을 얻을 대신를 사용하기위한$_SERVER['query_string'] htaccess 매개 변수를 하거나 전달하는 대신를 . 색인 페이지)

6. TTL-DNS SETTINGS에서 N 초를 사용하여이 와일드 카드 하위 도메인의 실행 속도를 높입니다.

7. 주어진 ttl 시간 (600-10 분) 후에 =>와 같은 하위 도메인을 확인합니다. http://abc.domain.tld

(참고 : 와일드 카드 하위 도메인은 기존 하위 도메인을 재정의하지 않습니다. 기존 하위 도메인에 항상 우선 순위를두기 때문입니다.)

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