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

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

예 : johndoe.website.com

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

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



답변

빠른 요약

  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 매뉴얼 페이지에 설명되어 있습니다.


답변

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

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

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


답변

DNS 와일드 카드를 설정하는 것 외에도 과거에이 문제를 해결 한 방법 인 Apache 용 동적 대량 가상 호스팅을 살펴볼 수 있습니다.


답변

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";

}

답변

가장 쉬운 방법은 / 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 에서 찾았습니다
.


답변

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


답변

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

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

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

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