나는 또한 apache2 dynamic vhost fallback에 대한이 질문을 발견 했으며 Luc의 대답은 문제를 해결하는 데 많은 도움이되었지만 여전히 목표를 달성하기 위해 무엇을했는지 보여주고 싶습니다. 주로 추가 작업이 필요하고 생각하기 때문입니다. 미래의 모든 Google 직원에게 도움이 될 수 있습니다 ...
내 목표
- VPS를 가리키는 모든 도메인 및 하위 도메인에 대한 동적 vhosting
foo.com
와 동일한 콘텐츠를 제공해야합니다 www.foo.com
- 알려지지 않은 도메인을 기본으로 대체
- 의 알 수없는 하위 도메인에 대한 폴백 (fallback)
foo.com
을 www.foo.com
(가)하지 않는 한 www
대체 대신 기본값으로, 사용할 수 없습니다
DNS
VPS를 가리키는 몇 개의 도메인 (및 모든 하위 도메인)이 있습니다. 예를 들면 다음과 같습니다.
- foo.com
- bar.com
- foobar.com
파일 시스템
다음 디렉토리가 있습니다. 도메인에는 사용 가능한 하위 도메인의 이름을 가진 디렉토리가 있습니다. www 디렉토리는 필요하지만 구성은 존재하지 않는 상황을 처리 할 수 있어야합니다. 로컬 호스트는 기본 폴백으로 사용됩니다.
/var
/www
/localhost
/foo.com
/www
/bar
/bar.com
/foo
테스트
목표를 테스트 가능한 사례로 변환 :
- foo.com 은 foo.com/www 에서 제공해야합니다.
- www.foo.com 은 foo.com/www 에서 제공해야합니다.
- bar.foo.com 은 foo.com/bar 에서 제공해야합니다.
- foo.foo.com 은 foo.com/www 에서 제공해야합니다 (foo.com/foo는 존재하지 않습니다)
- bar.com 은 localhost 에서 제공해야합니다 (bar.com/www는 존재하지 않습니다)
- www.bar.com 은 localhost 에서 제공해야합니다 (bar.com/www는 존재하지 않습니다)
- foo.bar.com 은 bar.com/foo 에서 제공해야합니다.
- bar.bar.com 은 localhost 에서 제공해야합니다 (bar.com/bar는 존재하지 않음)
- foobar.com 은 localhost 에서 제공해야합니다 (foobar.com은 존재하지 않습니다)
- www.foobar.com 은 localhost 에서 제공해야합니다 (foobar.com은 존재하지 않습니다)
- foo.foobar.com 은 localhost 에서 제공해야합니다 (foobar.com은 존재하지 않습니다)
해결책
이 용도 : mod_rewrite
, mod_proxy_http
그리고 당연히 mod_vhost_alias
.
ServerName my.domain
ServerAdmin admin@my.domain
<VirtualHost *:80>
ServerName localhost
VirtualDocumentRoot /var/www/localhost
</VirtualHost>
<VirtualHost *:80>
ServerName sub.domain
ServerAlias *.*.*
VirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
RewriteCond /var/www/%2.%3 !-d
RewriteRule (.*) http://localhost/$1 [P]
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
RewriteCond /var/www/%2.%3/%1 !-d
RewriteCond /var/www/%2.%3/www !-d
RewriteRule (.*) http://localhost/$1 [P]
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
RewriteCond /var/www/%2.%3/%1 !-d
RewriteRule (.*) http://%2.%3/$1 [P]
</VirtualHost>
<VirtualHost *:80>
ServerName bare.domain
ServerAlias *.*
VirtualDocumentRoot /var/www/%-2.0.%-1.0/www
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)$ [NC]
RewriteCond /var/www/%1.%2 !-d [OR]
RewriteCond /var/www/%1.%2/www !-d
RewriteRule (.*) http://localhost/$1 [P]
</VirtualHost>
이것은 어떻게 작동합니까? 세 개의 가상 호스트가 정의되어 있습니다.
localhost
로컬 호스트는 기본값으로 사용됩니다. 해결할 수없는 모든 요청은 localhost에 의해 제공됩니다. localhost에서 도메인으로 심볼릭 링크를 설정하는 것은 해당 사이트를 기본값으로 설정하는 것과 같습니다.
하위 도메인
하위 도메인 가상 호스트는의 형식으로 모든 요청을 *.*.*
받습니다. 기본적으로 모든 요청은에서 /domain.com/sub
정의한대로 제공 됩니다 VirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3
.
폴백 :
첫 번째 RewriteRule
는 알려지지 않은 도메인을 처리합니다. domain.com
localhost 웹 사이트를 프록시하여 디렉토리가 존재하지 않습니다.
두 번째 RewriteRule
는 또한 디렉토리 domain.com/sub
와 domain.com/www
디렉토리가 모두 없을 때 localhost에 프록시합니다 .
세 번째 RewriteRule
로 프록시 domain.com
때 domain.com/sub
존재하지 않습니다. 우리 domain.com/www
는 두 번째 다시 쓰기 블록으로 인해 존재한다는 것을 알고 있습니다.
bare.domain
bare.domain 가상 호스트가 *.*
요청 을 받아 처리합니다./domain.com/www
여기에 RewriteRule
의지 프록시 때 로컬 호스트 domain.com
또는 domain.com/www
존재하지 않습니다.
^ $ %. * !!!
나는 모든 주위에 내 머리를 감싸는 몇 가지 문제가 있었다 $
및 %
의 징후 RewriteCond
와 RewriteRule
나는 여기에 대해 설명 할 것 정도 :
ServerAlias *.*.*
VirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
RewriteCond /var/www/%2.%3/%1 !-d
RewriteRule (.*) http://%2.%3/$1 [P]
- 는
*
에있는 ServerAlias
와일드 카드입니다.
%n
에서는 VirtualDocumentRoot
으로부터 있습니다 문서 이름 보간 .
%n
에서 두 번째 RewriteCond
선택 사항을 참조 (.*)
처음부터 RewriteCond
예. 요청 된 도메인의 일부
%n
에는 RewriteRule
너무 않습니다.
$1
에서이 RewriteRule
선택에 의미 (.*)
의 시작 부분에 RewriteRule
. 도메인 ?
에서 요청 URL 까지 모든 것을 캡처합니다 . 모든 querystring은에 의해 url에 자동으로 추가됩니다 mod_proxy
.