Linux WEB

mod_rewrite 모듈 설치 및 기본 사용법

2009.07.02 02:13

sylee 조회 수:38417

Apache의 rewrite Module

 

mod_rewrite는 apache module의 한 종류로 서버 Request를 정해진 Rule에 의해서 다른 URL or File로 보내는 모듈 입니다.

아래 내용은 아파치에 mod_rewrite 모듈을 추가 하는 방법과 mod_rewrite의 지시자 종류 및 사용방법등을 설명 한 것입니다.

 

1. apache 컴파일 or rewrite 모듈 추가

 

apache 소스 다운로드 : http://www.apache.org

 

아파치 사이트에서 아파치 소스를 다운받아 압축 해제후 apache 컴파일 옵션에 아래와 같이 --enable-rewrite 옵션을 추가 합니다.

아래 예제와 같이 아파치 ./configure 실행시에 --enable-rewrite를 추가하면 rewrite 모듈이 아파치 모듈에 올라가 사용할 있게 됩니다.

 

예제)

[root@localhost src]# wget http://archive.apache.org/dist/httpd/httpd-2.2.10.tar.gz

[root@localhost src]# tar xvgz httpd-2.2.10.tar.gz

[root@localhost src]# cd httpd-2.2.10

 

- apache 컴파일시 --enable-rewrite 모듈을 포함하여 컴파일 하는 경우

 

[root@localhost httpd-2.2.10]# ./configure --prefix=/usr/local/apache2 --enable-rewrite

 

 

- 기존 apache 사용하는 중에 --enable-rewrite 을 추가 하는 경우

 

[root@localhost httpd-2.2.10]# /usr/local/apache2/bin/apxs -aic modules/mappers/mod_rewrite.c

 

 컴파일이 완료되면 apache2/conf/httpd.conf 화일 내용에 아래와 같이 라인이 추가된 것을 확인 할수 있습니다.

 

# LoadModule foo_module modules/mod_foo.so

LoadModule rewrite_module     modules/mod_rewrite.so

 

여기까지는 모듈 설치가 완료된 것으로 이후에는 rewrite_module 에서 지원되는 모듈 지시자를 이용하여 도메인 설정을 합니다.

  

2. Rewrite 를 적용할 수 있는 범위

 

rewrite 설정은 Server Config, Virtual Host, Directory, .htaccess 에 설정할 수 있으며 apache 서버 전체에 Global 설정과 특정 가상호스트에만 적용하도록 할수 있고 특정 디렉토리에만 적용시킬수도 있습니다.

 

3. .htaccess

 

.htaccess (hypertext access)는 Apache 웹 서버의 디렉토리 레벨을 설정하는 기본 파일입니다.

.htaccess는 한 특정 디렉토리에 위치하며, 모든 하위 디렉토리를 포함한 해당 디렉토리에 영향을 가지며 이 파일이 위치한 특정 폴더에 사용자가 정의한 Request 기능을 적용합니다.

 

4. Rewrite 모듈 지시자

 

- RewriteEngine  On|Off

 

Rewriteing 엔진을 사용할지 여부를 설정합니다. 기본설정은 Off로 되어 있으며 RewriteEngine On 으로 설정하명 Rewritng 엔진이 활성화 됩니다

 

- RewreteLog FILE-PATH

 

RewriteLog 지시자는 Rewrite 엔진의 로그를 그록할 파일을 지정합니다.

RewriteLog 파일을 항상 남기기 보다 잘못된 Rewrite 규칙들을 디버킹할 때 사용하기를 권장합니다. 아파치와 마찬가지로 RewriteLog 파일도 방문자 수가 많은 사이트에서는 많은 로그파일이 쌓이기 때문에 해당 파티션의 여유공간이 많이 없는 시스템에서는 장래를 유발 할수도 있으므로 로그를 잘 관리 해야 합니다.

RewriteLog 지시자는 반드시 RewriteLogLevel 지시자와 함께 사용하여야 됩니다.

 

 

- RewriteLogLevel  Level

 

RewriteLogLevel 지시자는 RewriteLog 지시자로 설정한 로그파일에 기록할 로그들에 대해 얼마나 자세한 내용을 로그로 남길것인가에 대해 설정하는 지시자입니다.

기록할 로그 Level 0 ~ 9까지 사용할 수 있으며 0은 로그를 기록하지 않겠다는 의미입니다.

 

- RewriteCond  TestStirng CondPattern

 

RewriteCond 지시자는 RewriteRule 과 함께 사용되는 규칙으로 RewriteCond 다음에 오는 RewriteRule RewrieteCond 에서 설정한 패턴과 일치해야지만 RewriteRule들을 실행합니다.

 

)

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ http://test. example.com/$1

 

-d : 디렉토리를 의미합니다. TestString이 디렉토리를 가리키거나 포함하고 있을 때 처리됩니다.

-f : 파일을 의미합니다. TestString이 파일을 가리키더나 포함하고 있을 때 처리됩니다.

-l : 심볼릭링크를 의미합니다. TestString이 심볼릭링크를 가리키거나 포함하고 있을 때 처리됩니다.  마지막으로 느낌표(!) 는 부정을 뜻합니다.

 

- RewriteRule  Pattern Substitution

 

Rewrite 모듈의 실질적인 Rewrite 규칙들을 적용하는 지시자입니다.

Pattern(Input URL) 을 Subtitution(Return URL)로 변경하기 위한 모든 규칙들은 이 지시자를 사용해서 설정해야 됩니다.

Pattern(Input URL) 에는 Perl 정규표현식을 사용할수 있기 때문에 Input URL 의 규칙을 유연하게 적용할 수 있습니다.

이와 관련된 사용방법이나 예제는 아래에서 다시 설명 합니다.

 

5. 정규표현식 기초

 

. : 다수의 한문자

? : 0개 이상의 한문자

* : 0개 이상의 문자 또는 문자열

+ : 1개 이상의 문자 또는 문자열

(chars) : (, ) 안의 문자또는 문자열을 그룹으로 묶습니다. 이 문자그룹은 Substitution(return URL)에서 $N 의 변수로 활용할수 있습니니다.

^ : 문자열의 첫문()을 지정합니다.

$ : 문자열의 끝 문자()을 지정합니다.

(역슬래쉬) : 정규표현식에서 특별한 의미로 사용되는 문자의 특수기능을 제거합니다.

(예:(, ), [, ] . )

{n} : 정확히 n번 반복

{n,} : n번 이상 반복

{n,m} : n 이상 m 이하 반복

[chars] : 문자들의 범위 또는 표현할 수 있는 문자들을 설정합니다.

) [a-z] : a 부터 z 까지의 소문자, [tT] : 소문자 t 또는 대문자 T

 

6. 정규표현식 단축표현들

 

[:alpha:] : 알파벳. [a-zA-Z] 와 같은 표현

[:alnum:] : 알파벳과 숫자. [a-zA-Z0-9] 와 같은 표현

[:digit:] : 숫자 [0-9] 와 같은 표현

[:upper:] : 대문자. [A-Z] 와 같은 표현

 

7. RewriteRule 플래그

 

forbidden|F :

    요청하는 페이지를 403 에러로 redirect 시킵니다.

    RedirectRule 이 적용되고 있는 페이지를 일시적으로 사용중단을 시키거나 사용자로 하여금

페이지 접근을 할수 없게 할 때 사용합니다.

    ) RewriteRule ^/test /home/blog/html/test.php [F]

    사용자가 /test 로 접근할 경우 403 에러를 보냅니다.

 

gone|G :

    요청하는 페이지를 410 에러로 redirect 시킵니다.

    410 에러는 페이지가 사라젔거나 존재하지 않는다는 메시지입니다.

    이것도 forbidden 과 마찬가지로 RedirectRule 이 적용되던 페이지를 일시적으로 중단시킬 때 유용하게 사용할 수 있습니다.

 

last|L :

    이 플래그가 적용되면 뒤에 어떤 룰이 있더라도 이룰 아래의 규칙들은 적용되지 않고 RewriteRule 을 빠져나가게 됩니다.

    C, Perl, PHP 프로그램에서 루프를 빠져나가는 break 와 같은 의미를 가집니다.

 

     )

RewriteRule ^/$ <보여질 주소> [L]

RewriteRule ^$ <보여질 주소> [L]

위의 두 줄은 html 루트에 접근했을 때 어떻게 하는가를 보여줍니다.

[L]은 이 조건을 만족하여 URL Rewrite 했을때 더이상 .htaccess의 내용을 파싱하지 않고 종료하라는 지정자입니다.

앞에 쓰여진 ^/$ 'http://www. example.com/'이란 주소로 입력 되었을 때를 위한 처리입니다.

두번째의 ^$ /를 마지막에 붙이지 않고 그냥 'http://www. example.com'으로 접속했을 때의 처리입니다.

 

제로보드 XE를 기준으로 위의 Rewrite Rule을 적용시킬 경우 예)

RewriteRule ^/$ ./zbxe/index.php?mid=(초기 mid) [L]

RewriteRule ^$ ./zbxe/index.php?mid=(초기 mid) [L]

만일 처음 보여질 모듈 이름이 blog라면 그냥 'mid=blog'라고 써주면 됩니다.

 

chain|C :

    이 플래그의 결과를 다음 RewriteRule input 값으로 사용합니다.

    )

    RewriteRule ^(.+) %{HTTP_HOST}$1 [C]

    RewriteRule ^([^.]+).example.com(.*) /home/$1/public_html$2

    이 룰은 사용자 홈의 도메인을 2차 도메인으로 자동 설정해 줄 때 많이 쓰는 룰입니다.

    RewriteRule의 input은 도메인을 제외한 URI 를 인식하기 때문에 도메인까지 인식을 시켜서 다음 RewriteRule 로 체크를 하기 위해 사용한 것입니다.

 

    http://user_id. example.com/hello.html 이란 요청이 들어오면

/home/user_id/public_html/hello.html 로 redirect 시켜줍니다.

    위와 같이 2차 도메인을 이용해 계정 사용자의 홈을 지정하기 위해서는 DNS 세팅이 선행되어야 됩니다.

 

N : 새로운 Rule이 시작된다는 의미입니다.

R : Redirection. 무조건 넘깁니다. 뒤 주소로 넘긴다는 의미입니다.

NC : 대소문자를 구별하지 않습니다.

OR : 프로그래밍의 or와 비슷합니다.

QSA : Cond의 내용을 지난 결과에 덧붙입니다.

NE : Out 될 값에 특수문자가 HexCode로 되어 포함되어 있는 경우

 

 

 < RwriteRule 설정예 >

 

1.  http:// example.com/user_id -> http:// example.com/test.php?id=user_id

RewriteRule ^/([a-zA-Z0-9])$  /home/user_id/public_html/test.php?id=$1

 

설명 : 도메인(http://example.com) 뒤에 오는 영문숫자로된 문자열을 지정하면서 그룹으로 묶었습니다. 이렇게 그룹으로 설정된 문자열 Pattern Substitution(return URL) 에서 $1 이라는 변수로 받아 사용하게 됩니다. http://example.com/user2 라는 페이지 요청이 들어오면 실제로는 http:// example.com/test.php?id=user2 라는 페이지로 redirect 시켜줍니다.

 블로그나 카페(동호회) 사이트에서 블로그 사용자의 ID 로 개인 블로그 주소를 부여할 때 http://blog.com/user_id 로 부여해 주지만 실제 실행되는 파일은 이와 같이 redirect 시켜주는 경우가 많습니다.

 

2. http://example.com/daum -> http://www.daum.net

 

RewriteRule ^/daum$ -> http://www.daum.net

 

설명 : http://example.com/daum 라는 페이지 요청이 들어오면 도메인이 다른 http://www.daum.net 이라는 페이지로 redirect 시켜줍니다.

 

3. 적용 예

 

RewriteRule ^(/images/.*)$ http://www.example.com$1

    RewriteRule ^(/data/.*)$ http://www.example.com$1

위 설명은 /images , /data 디렉토리에 대한 요청은 http://www.example.com/images/~ 으로 Redirect 시키라는 내용 입니다.

 

 

 

번호 제목 글쓴이 날짜 조회 수
43 PHP 컴파일시 /usr/bin/ld: cannot find -lltdl 오류 호스트웨이 2012.07.13 12544
42 [Apache] Image 관련 Log 남기지 않기 호스트웨이 2012.07.13 9705
41 PHP 업로드 파일 용량 제한 설정 호스트웨이 2012.07.06 10042
40 SSL config error 조치사항 호스트웨이 2012.06.29 9631
39 Apache2.4.x 버전 설치 호스트웨이 2012.06.22 23693
38 PHP-5.3 버전 이상에서 Deprecated 에러 발생시 처리 방법 호스트웨이 2012.06.22 14713
37 PHP 속도 향상을 위한 eAccelerator 설치 호스트웨이 2012.06.15 11264
36 ZendOptimizer 3.3.9 설치 file 호스트웨이 2012.06.01 17546
35 웹페이지에 사용자 인증 사용하기 호스트웨이 2012.05.18 8972
34 apache ssl 시작시 오류 메세지 호스트웨이 2012.05.11 10054
33 mod_GeoIP를 이용한 국가 IP 확인 및 국가별 접속 제한 호스트웨이 2012.05.04 19934
32 apache에서 cgi를 사용하기 위한 설정 방법 호스트웨이 2012.04.27 20125
31 Zend Guard Loader 설치 호스트웨이 2012.04.20 17811
30 PHP에서 MS-SQL 서버를 연동하기 위한 방법 호스트웨이 2012.04.13 25303
29 Linux log 분할 방법 (logrotate) 호스트웨이 2012.04.06 12587
28 APM 및 OS 버전 확인 하는 방법 호스트웨이 2012.03.30 13982
27 phpize를 이용하여 모듈 추가 file 호스트웨이 2012.03.15 15582
» mod_rewrite 모듈 설치 및 기본 사용법 sylee 2009.07.02 38417
25 아파치2 에서 mod_cband 사용법 sylee 2009.06.05 24553
24 register_globals 옵션에 따른 변수 전달 jook 2009.02.19 34709