본문 바로가기
Network

Apache mod_rewrite

by 세계정보ㄱ 2012. 8. 16.
728x90
반응형

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 시키라는 내용 입니다.



* Simple Redirection ( Redirection [original] [target] )


-http://www.example.com/pics/1.jpg -> http://www.example.com/images/1.jpg

Redirect /pics/ http://www.example.com/images/


-http://www.example.com -> http://other.example.com

Redirect / http://other.example.com/


-http://www.example.com -> https://www.example.com

Redirect / https://www.example.com


* More Complicated Redirects ( Redirect 보다 느림. )


-GIF -> PNG

RedirectMatch (.*)\.gif http://images.example.com$1.png


-/aaa/밑의 숫자로 된 주소만 target으로 Redirect

RedirectMatch /aaa/([0-9]+)$ http://target/$1 == 301 /aaa/([0-9]+)$ http://target/$1


-RedirectMatch /(.*)$ http://target/$1 == ^(.*)$ http://target$1


-RedirectMatch (.*) https://target$1 == ^(.*)$ https://target$1


* RewriteRule ( RewriteRule pattern target_url [flag, flag, flag, ...] )


-Log 설정

RewriteLog /PATH/FILE

RewriteLogLevel 9 ( 0 ~ 9 : 숫자가 높을수록 자세한 로그 )


-RewriteCond ( RewriteCond TestString CondPattern )

-RewriteRule ( RewriteRule Pattern Substitution )

-Flags

1. Chain | C


-http://aaa.com/bbb -> http://aaa.com/index.php?id=bbb

RewriteEngine On

RewriteRule ^/([a-zA-Z0-9]+)$ /aaa.com DocumentRoot/index.php?id=$1



-http://aaa.com -> http://bbb.com

RewriteEngine On

RewriteCond %{HTTP_HOST} ^(aaa\.com)

RewriteRule ^(.*) http://bbb.com/$1 [L]


RewriteEngine On

RewriteCond %{HTTP_HOST} aaa\.com

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

RewriteRule ^([^.]+)\.aaa\.com(.*)  http://$1.bbb.com/$2  [L]

RewriteRule ^aaa\.com(.*)  http://bbb.com/$1  [L]


-http://www.aaa.com, aaa.com -> http://www.bbb.com

RewriteEngine On

RewriteCond ${HTTP_HOST} ^(www\.aaa\.com|aaa\.com)

RewriteRule (.*) http://www.bbb.com/$1 [L]


-http://aaa.com -> http://www.aaa.com

RewriteEngine On

RewriteCond %{HTTP_HOST} ^(aaa\.com)

RewriteRule (.*) http://www.aaa.com/$1 [L]


-http://aaa.com -> http://aaa.com/bbb

RewriteEngine On

RewriteCond %{HTTP_HOST} ^(aaa\.com)

RewriteRule (.*) /bbb/$1 [L]


-http://aaa.com -> http://bbb.com // 301 redirect

RewriteEngine On

RewriteRule (.*) http://bbb.com/$1 [R=301,L]


-http://aaa.com/aaa1 -> http://bbb.com // 301 redirect

RewriteEngine On

RewriteRule ^aaa1/(.*) http://bbb.com/$1 [R=301,L]



The Definitive Guide to Apache mod_rewrite.pdf

 

mod_rewrite-cheat-sheet-v2.pdf

728x90
반응형

'Network' 카테고리의 다른 글

PHP Magic Quotes  (0) 2012.10.10
PHP Register Globals  (0) 2012.10.10
Apache Performance Tuning  (0) 2012.07.20
Nginx 1.x 413 request entity too large  (0) 2012.02.05
Server SSL 설정 방법  (0) 2012.01.18