본문 바로가기

WEB Server&WAS/Apache

[아파치]mod_rewrite 설정

1. mod_rewrite reference

http://httpd.apache.org/docs/2.0/en/mod/mod_rewrite.html


2. URL Rewriting Guide

http://httpd.apache.org/docs/2.0/ko/misc/rewriteguide.html

or

http://httpd.apache.org/docs/2.0/misc/rewriteguide.html



아래 내용 출처: http://www.gnunix.co.kr/4



.htaccess - RewriteCond, RewriteRule


.htaccess 에 대해서 알고싶었다. 약간의 공부가 필요했다. 검색했다.

없다...

아주 간단한 예제만 나와있거나 이럴경우 저럴 경우만 나와있다.

조금이라도 자세히 들어가려 한 내용은 찾기 힘들었다.


그래서 내가 준비했다.

이거.. 원... 완성할떄쯤 또 딴데서 먼저 나오는거 아닌가 몰라 ㅎㅎ


인터넷에 정보가 너무나도 부족했다.

영문사이트외엔-


이하 모두 Apache사이트를 참고했다.



1. .htaccess


.htaccess

그래 맞다. 앞에 .이 붙으면 숨겨있는 파일이다.

열어보자.


  {code}

  php_flag register_globals on

  RewriteEngine On

  RewriteBase /

  RewriteCond %{HTTP_HOST} !^(www)\.gnunix\.co\.kr$ [NC]

  RewriteRule (.*) http://www.gnunix.co.kr/$1 [R=301,L]

  ErrorDocument 401 http://www.gnunix.co.kr/401error.html

  {code}


간단하게 요정도?


난 RewriteCond와 RewriteRule에 대해서만 언급해보려한다.

RewriteEngine On은 Rewrite모듈의 사용을 위해 기본적으로 On으로 설정해두는것이

좋다.

RewriteBase는 기본적으로 .htaccess가 위치안 물리적 경로로 설정하지만 Rewrite의

쓰임이 너무

광범위하기에 다르게 쓰이는 경우도 많다.


그 외에 RewriteOptions, RewriteLog, RewriteLogLevel, RewriteLock, RewriteMap등은

심화과정이므로 취급하지 않습니다 ^^;;


이 글은 완벽하지 않다. 잘쓴 글도 아니고 잘 되어있는 글도 아니다.

하지만 당신이 컴퓨터에 대한 열정이 있고 그만큼의 노력이 있었으며 독학에 재능이

있다면 이정도의

글로도 만족할것이라 믿는다. (쓸데없는 잡담이 너무 많은거 뺴고... ㅡㅡ;;)


이제 본론으로 고고-


Rewrite모듈은 URL Rewrite 엔진일까?



2. RewriteCond와 RewriteRule의 기본 형태


RewriteCond와 RewriteRule의 기본 형태는 이렇다.


  {code}

  RewriteCond     TestString     CondPattern

  RewriteRule     Pattern        Substitution

  {code}


RewriteCond는 RewriteRule을 위해 존재하기도 하지만 RewriteRule은 RewriteCond를 위해

존재하기도 한다.

하지만 순서는 거의 대부분 Cond후에 Rule이 온다.

Cond는 생략하고 Rule만 있는경우도 많다.

기본형태는 이러하지만 RewriteCond만 있을수도 있고 RewriteRule만 있을수도 있으며

둘다 여러개일수도

있고 둘중 하나만 여러개일수도 있다. 순서도 맘대로라서 엄청나게 다양한 응용이

가능하다 ㅋ



3. 처리 경로(흐름)


제일 먼저 Rule의 Pattern에 어긋나지 않는다면 Cond의 TestString으로 가서 조건검사를

시작한다.

그후 CondPattern을 지나 Substitution으로 처리되어 조건에 만족하게 된다.


다음을 보자


  {code}

  ...

  RewriteRule     Pattern     Substitution


  RewriteCond     TestString     CondPattern

  RewriteRule     Pattern     Substitution


  RewriteRule     Pattern     Substitution

  ...

  {code}



위의 경우 Cond와 Rule이 막 써있다 ㅋ 두개 이상의 Rule이 있을경우 위  Rule이 처리,

적용된 결과가 다시 두번째 Rule에 적용된다. 또 아래 Rule이 있다면 그 결과가 다시

검사될것이다.

혹은. 위의 조건에 맞지 않는 값이라면 다음 Rule로 넘긴다.



이하부터는 패턴, 대용(대체), 조건패턴등의 한글화를 섞어 쓰겠다.

Cond는 조건의 약자이고 Rule은 그대로 규칙, 법이다.



4. 특수 문자


프로그래밍을 하면서 그 프로그램 내부 코드나 명령어로 쓰이고 있어서 쓰지 못하는

문자가 많다.

여기서도 마찬가지이다. 하지만 어디서나 존재하는 Escape문자 있으니 여기서는

"\"(역슬래쉬(원))표시가


쓰인다. 보통 .이 잘못쓰일것을 대비하여 \.로 쓰는게 보통이다.


예 : gnunix.co.kr   ==>   gnunix\.co\.kr


주로 점.이나 대괄호[], 괄호()등에 쓰인다.

이는 Cond에만 적용되는 이야기이다.


5. RewriteCond


RewriteCond의 기본 구문은 이미 위에서도 나왔다.

그곳 Test스트링부분에 $N이나 %N이 쓰인다면 역참조 기능을 제공하게된다.

여기서 N은 (1<=N<=9)이다.


$N의 경우 현재 처리되고있는 Rule에서 가르키고 있는 패턴이 그룹으로 묶여 제공된다.

$N을 하나의 변수처럼 사용할수 있게되는것이다.

아래도 나와있지만 괄호로 그룹을 묶은 부분이 변수로 사용된다.


  {code}

  RewriteCond   %{HTTP_HOST}             ^[^.]+\.gnunix\.co\.kr$

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

  RewriteRule   ^([^.]+)\.gnunix\.co\.kr(.*)   /home/$1/htdocs$2

  {code}


위 예제의 경우 도메인 앞의 URI를 $1로 그 뒤 경로를 $2로 지정하여 특정 디렉토리의

내용을 읽도록 하는 내용이다.

이것을 짧게 한줄로 고쳐보자면


  {code}

  RewriteRule ^([^.]+)\.gnunix\.co\.kr(.*) /home/$1/htdocs$2

  {code}


요정도?


%N은 현재 처리중인 Cond에서 가르키고있는 조건과 일치한 패턴이 그룹으로 묶여

제공된다.

이건 잘 안쓰이는것같아서 정말 잘쓰이는 다음으로 패쓰~


%{Name}의 경우 해당 서버의 변수를 가지고 올수있다.

변수의 개수는 정말 엄청나게 많다. 하지만 자주 쓰이는 변수들은 아래를 통해서 한번

확인해보세요 ^^

http://gnunix.cafe24.com/study/

(위 링크가 언제 죽을지는 미지수입니다 ^^;;;)



6. CondPattern


CondPattern에서 쓰이는 내부 명령어? 특수명령어?등을 알아보도록하자


  {code}

  -d     =>     디렉토리를 뜻한다.

  결론적으로 Test스트링이 디렉토리를 가리키거나 포함하고 있을때 처리된다.

  -f     =>     파일을 뜻한다.

  Test스트링이 파일을 가리키거나 포함하고 있을때 처리된다.

  -l     =>     심볼릭링크를 뜻한다.

  Test스트링이 심볼릭링크를 가리키거나 포함하고 있을때 처리된다.

  심볼릭 링크가 뭐냐고 물으신다면 리눅스나 유닉스를 공부해보세요 ^^ 라고 답하고

싶다^^


  그리고 느낌표(!)는 부정을 뜻한다.

  {code}


  {code}

  RewriteEngine On

  RewriteCond %{REQUEST_FILENAME} !-f

  RewriteCond %{REQUEST_FILENAME} !-d

  RewriteRule ^(.*)$ http://test.gnunix.co.kr/$1

  {code}


위의 예제는 Request내용이 디렉토리나 파일을 가르키고 있지 않을경우 저쪽 사이트로

돌리라는 뜻. ^^

$1로 하위주소는 유지하려하고 있습니다 ^^



7. [Flag]


라인마다 Flag라 불리우는 깃발을 달수가 있습니다. 일종의 옵션으로 작용합니다 ^^


  {code}

  F     =>   403에러 Forbidden페이지로 된다.

  L     =>   Last라는 뜻입니다. 위의 Cond들은 여기까지만 적용된다 

  아래부터는 새로 시작 되겠지용~

  N     =>   새로운 Rule이 시작된다는 깃발.

  QSA   =>   Cond의 대용을 지난 결과에 덧붙인다.

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

  R     =>   리다이렉션. 무조건 넘긴다. 뒤 주소로 넘긴다는 뜻이지요 ^^

  NC    =>   대소문자 구별없다는 뜻.

  OR    =>   프로그래밍의 or와 비슷하다.

  {code}


아래를 참고하시죠 ^^


  {code}

  RewriteCond %{REMOTE_HOST}  ^gnunix.*  [OR]

  RewriteCond %{REMOTE_HOST}  ^<a href="#" class="key1"

onclick="openKeyword('/keylog/GNUNIX'); return false">GNUNIX</a>.* 

[OR]

  RewriteCond %{REMOTE_HOST}  ^INKOREAGUY.* [NC]

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

  {code}


gnunix나 GNUNIX나 INKOREAGUY나 inkoreaguy로부터 접속한 접속에 대하여

리다이렉트한다.

http://www.gnunix.co.kr/ 로

접속하게된다. 보통 IP주소를 적게되겠다.



8. RewriteRule



여기부터는 아주 간단간단하게... ㅡㅡ;


텍스트


  {code}

  .     =>  ?과 같습니다. 무엇이든 하나의 문자를 뜻합니다. A가 될수도 있고 Z가 될수

있다. 반드시 한글자.

  [A]   =>  역시 하나의 문자가 올수 있다는 뜻. ex) a[eo]t => aot 혹은 aet

  [^A]  =>  문자는 올수 없다는 뜻~ A부터 Z까지~


  ?     =>  0개 또는 1개의 텍스트.

  *     =>  0개 또는 1개 이상의 텍스트.

  +     =>  1개 이상의 텍스트. 0은 될수 없다.

  {code}


그룹


  {code}

  (텍스트)  =>   위의 텍스트에 속한 세가지를 조합하여 쓸수 있다

  예로 (..)는 두글자라는 거지요 ^^

  몇번째 그룹이냐에 따라서 위에 설명한 $N의 변수로 불러 쓸수있니다.

  {code}


Anchors


  {code}

  ^     =>   줄의 시작을 나타낸다 ex) ^a => a로 시작

  $     =>   줄의 끝을 말한다. ㄷㅌ) a$ => a로 끝

  {code}



이제 끝마쳐야겠다.

너무 힘들다 ㅋㅋㅋ

글이 너무 지루해지지않았을까 걱정된다.

아래 코멘트 달아주시면 조금씩 조금씩 조치면서 더 나은 모습으로 가고싶습니다-



p.s

.htaccess파일은 디렉토리(폴더)마다 존재 할수있다. 그리고 동작한다.

.htaccess는 왕이다. HTTP프로토콜로 URL을 통하여 들어오는 모든 접근에 대하여 다

지맘대로다.

이를 활용은 실로 무궁무진하다 *_*




참고, 출처 : Apach.org


p.s2

2008년 03월 19일

기존의 gnunix.co.kr/tc에서 gnunix.co.kr로 변경하였다.

tc폴더내의 내용을 밖으로 옮겨왔다.

때문에 기존의 tc로 접속들도 co.kr로 옮겨와야했다.


root의 .htaccess의 내용을 보자


  {code}

  RewriteEngine On

  RewriteBase /


  Redirect /tc http://www.gnunix.co.kr


  RewriteCond %{HTTP_HOST} ^gnunix\.co\.kr$ [NC]

  RewriteRule ^(.*)$ http://www.gnunix.co.kr$1 [R=301,L]


  RewriteCond %{REQUEST_FILENAME} -d

  RewriteRule ^(.+[^/])$ $1/ [L]

  RewriteCond %{REQUEST_FILENAME} !-f

  RewriteRule ^(.*)$ rewrite.php [L,QSA]

  {code}



그리고 기존 /tc의 .htaccess의 내용도 변경했다.


  {code}

  RewriteEngine On

  RewriteRule ^/tc$ http://www\.gnunix\.co\.kr

  RewriteRule ^/tc/([a-zA-Z0-9]+)$ http://www\.gnunix\.co\.kr/$1



p.s3

2008. 04. 17

현재 저의 .htaccess파일을 공개합니다.


  {code}

  php_flag register_globals on

  RewriteEngine On

  RewriteBase /


  Redirect /tc http://www.gnunix.co.kr


  RewriteCond %{HTTP_HOST} ^gnunix\.co\.kr$ [NC,OR]

  RewriteCond %{HTTP_HOST} ^gnunix\.co\.kr/([0-9]+) [NC]

  RewriteRule ^(.*)$ http://www.gnunix.co.kr/$1 [R=301,L]

  {code}


기존의 주소 'gnunix.co.kr/tc'로 접속하면 새로운 'gnunix.co.kr'로 이동합니다.


'gnunix.co.kr'이나 'gnunix.co.kr/글번호'

 로 접속하면 자동으로 'www'를 붙여줍니다.


출처 : http://www.linuxchannel.net/board/read.php?table=alpha&no=249&page=1