Server & OS

펌) mod_rewrite를 이용한 편리한 가상 도메인 운영방법

페이지 정보

본문

웹호스팅하는 서버를 관리하다 보면...
새로운 입주가 발생할 때 마다...
웹서버 세팅을 바꾸어야 하는데..
매우 귀찮은 일임이 틀림없다.

게다가 아파치의 한계로 인해..
무한히 가상 서버를 등록할 수도 없다.
(정확한 수치는 모르나... 100여개 이내로 보인다.)

아파치에는 rewrite라는 아주 훌륭한 기능이 있다.
"mod_rewrite를 사용할 수 없다면
당신이 아파치에서 사용할 수 있는 것은 없다."
라는 말이 있을 정도다.

이글은 rewrite모듈을 이용하여 보다 편리하게
가상도메인을 관리하고자 하는 이들을 위한 작은 팁을 제공한다.

몇가지 전제 조건:

아파치 버전 : > 1.3.20
서버IP : 192.168.0.1
서버기본 도큐먼트루트* : /var/www/html/ (Redhat 기본)
가상도메인들의 루트* : /var/www/vhost/도메인네임
ex) /var/www/vhost/wiki.domain.com/ /var/www/vhost/domain.com/
등록되지 않은 가상도메인들은 모두 서버기본 도큐먼트루트가 시작된다.
(* 상기의 내용은 충분히 변경 가능하다.)

운영방법
가상도메인의 등록이 필요하면..
ftp나 쉘접속으로 /var/www/vhost에
해당 도메인네임과 동일한 디렉토리를 만들어 주는 것으로 마무리된다.
ex) mkdir /var/www/vhost/new.domain.com

그밖의 기능
자동 리다이렉션.
DNS에 *.domain.com 등으로 등록되어 있고,
/var/www/vhost/www.domain.com이란 디렉토리를 생성했을 때
http://domain.com http://foobar.domain.com 모두
http://www.domian.com 으로 자동 리다이렉트가 된다.
하지만, foobar.domain.com란 디렉토리 역시 있을 경우..
http://foobar.domain.com 은 /var/www/vhost/foobar.domain.com으로
연결되고 그밖에는 모두 http://www.domain.com 으로 리다이렉션이 된다.

만약
/var/www/vhost/domain.com으로 등록되어 있을 경우에는
http://www.domain.com http://foobar.domain.com 모두
http://domian.com 으로 리다이렉트가 된다.
여기서도 마찬가지로 foobar.domain.com란 디렉토리 있을 경우..
http://foobar.domain.com 은 /var/www/vhost/foobar.domain.com으로
연결되고 그밖에는 모두 http://domain.com 으로 리다이렉션이 된다.

디렉토리 이름끝에 자동으로 / 붙여주기.
ex) http://domain.com/somedir -> http://domain.com/somedir/

한계
mod_rewrite가 참으로 유용하긴 하나.. 한계도 있다.
일단 alias나 scriptalias가 반영되지 않는다.
및의 예에는 /cgi-bin/이라는 scriptAlias를
rewriteRule를 사용 강제로 반영시키는 예제다..


  ScriptAlias    /cgi-bin/ "/var/www/cgi-bin/"

  RewriteRule  /cgi-bin(/.*)$                /cgi-bin$1        [L,PT]

또 한가지 자동 리다이렉션은..
http://domain.com http://www.domain.com 이 두유형에 대해서만 지원한다.
물론 변경할 수는 있다.

가상도메인내에 파일에서는
환경변수 DOCUMENT_ROOT값이 무의미하다.. (/var/www/html로 고정..)
그래서 VIRTUAL_DOCUMENT_ROOT라는 새로운 환경변수를 사용한다.
만약 DOCUMENT_ROOT를 스크립트중에 사용한다면.
대신 VIRTUAL_DOCUMENT_ROOT를 이용하면된다.

마무리

아래의 내용을 편집하거나 혹은 자세한 설명이 필요하다면.
아래의 URL을 참조하기 바란다.
http://httpd.apache.org/docs/mod/mod_rewrite.html
http://httpd.apache.org/docs/misc/rewriteguide.html

그리고 디버깅이 필요하면 아래의 두줄에 주석을 풀어주면 된다.


#      RewriteLog      "/var/www/vhost/rewrite.log"

#      RewriteLogLevel 9

경고 상당히 많은 로그가 발생하므로 디버깅 목적이 아니면...
반드시 주석처리를 해놓을 것!!

사용중 문제가 발생하거나, 의문이 생기면.. 이글에 리플을 달아주세요. :)
자세한 동작방식에 대해서는 언급하지 않았는데..
기회가 나면, mod_rewrite의 간략한 문법 소개와 함께 올리도록 하겠습니다.



<VirtualHost 192.168.0.1>

        ServerAdmin    foo@bar.com

        ServerName      *

        DocumentRoot    /var/www/html/



      DirectoryIndex  index.php index.html index.htm

        ScriptAlias    /cgi-bin/ "/var/www/cgi-bin/"



      RewriteEngine  On



# for Debug

#      RewriteLog      "/var/www/vhost/rewrite.log"

#      RewriteLogLevel 9



      RewriteRule    ^/cgi-bin(/.*)$                /cgi-bin$1        [L,PT]



      RewriteRule    ^(.*)          %{HTTP_HOST}$1



      RewriteCond    /var/www/vhost/%{HTTP_HOST}    -d

        RewriteRule    ^(.+)  /var/www/vhost/$1      [s=4,E=VIRTUAL_DOCUMENT_ROOT:/var/www/vhost/%{HTTP_HOST}/]



      RewriteCond    /var/www/vhost/www.%{HTTP_HOST} -d

        RewriteRule    ^(.*)          http://www.$1                          [L,R]



      RewriteCond    %{HTTP_HOST}    !^www\\..+$

        RewriteCond    /var/www/vhost/www.$2          -d

        RewriteRule    ^([^.]+.)([^/]+)(.+)$          http://www.$2$3        [L,R]



      RewriteCond    /var/www/vhost/$2              -d

        RewriteRule    ^([^.]+.)([^/]+)(.+)$          http://$2$3            [L,R]



      RewriteRule    ^([^/]+/)(.*)                  %{DOCUMENT_ROOT}$2      [s=1]



      RewriteCond    $1$2            ^.*[^/]$

        RewriteCond    $1$2            -d

        RewriteRule    ^(/var/www/vhost/)(.+[^/])$      http://$2/        [L,R]



      RewriteCond    $1$2            ^.*[^/]$

        RewriteCond    $1$2            -d

        RewriteRule    ^(/var/www/html/)(.+[^/])$      http://%{HTTP_HOST}/$2/        [L,R]



      HostNameLookups off

</VirtualHost>

관련자료

등록된 댓글이 없습니다.
Today's proverb
하루라는 시간은 짧지만 하루가 지나면 그 소중한 시간은 다시 되돌릴 수 없다.