답변:
ServerAlias
DNS 설정에서 와 같은 와일드 카드 도메인 항목 을 만들어야합니다 *.example.org
. 와일드 카드 항목은 다음과 같습니다.
*.example.org. 3600 A 127.0.0.1
다음으로 Apache 구성에서 ServerAlias
DOC 지시문에 와일드 카드를 지정하는 가상 호스트 컨테이너를 설정해야합니다 . 가상 호스트 컨테이너의 예 :
<VirtualHost *:80>
ServerName server.example.org
ServerAlias *.example.org
UseCanonicalName Off
</VirtualHost>
그런 다음 PHP 스크립트에서 $_SERVER
super 전역 변수를 살펴봄으로써 도메인을 찾을 수 있습니다 . 다음은 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 매뉴얼 페이지에 설명되어 있습니다.
RewriteRule "^/?(.*)" "http://%{HTTP_HOST}/%{HTTP_HOST}/$1" [L,R,NE]
먼저 모든 하위 도메인을 허용 한 다음 하위 도메인이 유효한지 확인할 수 있습니다. 예를 들면 :
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 에서 찾았습니다 .
Mod_vhost_alias 는이를 수행하는 데 적합한 모듈입니다.
한 줄로 Apache에게 디렉토리 해싱 등으로 올바른 위치를 찾도록 지시 할 수 있습니다. 예를 들면 다음과 같습니다.
VirtualDocumentRoot /http/users/%3.1/%3.2/%3
subdomain.yourdomain.com에 대해 요청되면 Apache에 문서 루트를 / http / users / s / u / subdomain으로 설정하도록 지시합니다.
Apache의 Dynamic Mass Virtual Hosting을 사용하는 와일드 카드 DNS도 합리적인 솔루션이라고 생각합니다. 비록 나는 그것을 시도한 적이 없습니다.
여러 서버로 확장해야하거나 다른 솔루션이 작동하지 않는 경우 데이터베이스 기반 DNS 서버를 사용하는 것이 좋습니다. 과거에 MyDNS 를 성공적으로 사용 했습니다 . MySQL (또는 PostgreSQL)을 사용하기 때문에 PHP 또는 그 밖의 모든 것을 사용하여 즉석에서 DNS를 업데이트 할 수 있습니다. 코드는 한동안 업데이트 된 것처럼 보이지 않지만 DNS이므로 정확히 최첨단이 아닙니다.
먼저 서버 DNS 편집기를 사용하여 DNS 설정을 만들어야합니다.
서버 IP 주소의 A
호스트 *
와일드 카드를 사용하여 DNS 설정에서 레코드를 만듭니다 .
* 1400 IN A ip_address
A
호스트 @
또는 domain_name.tld
서버 IP 주소를 사용하여 DNS 설정에서 다시 한 번 레코드를 만듭니다 . tld는 최상위 도메인 또는 .com, .org 등과 같은 도메인의 확장을 의미합니다.
@ 1400 IN A ip_address
또는
domain_name.tld 1400 IN A ip_address
다음 CNAME
과 같이 레코드를 만듭니다 .
www 1400 IN A domainname.tld
*
같은 와일드 카드를 사용 하여 하위 도메인을 만듭니다.*.domain.tld
의 하위 도메인 디렉토리에 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
(참고 : 와일드 카드 하위 도메인은 기존 하위 도메인을 재정의하지 않습니다. 기존 하위 도메인에 항상 우선 순위를두기 때문입니다.)
wildcard subdomains
있다면 내 솔루션을 참조하십시오.htaccess
.