이전에 티스토리를 사용하며 블로깅한 내용이 모두 bystory.co.kr/게시물번호 였었는데
이번에 옮기며 bystory.co.kr/blog/게시물번호가 되버렸다.
그래서 단순히 리라이트부분에 숫자로 들어오는 부분을 /blog/숫자로 변경만 해주면 될줄 알았는데
되질 않아 열심히 고심을 하던중 태터툴즈 포럼에 글을 등록하였는데 친절하게 알려주셔서 해결하게 되었다.
다시한번 감사합니답


=== 답변 내용 ===========================================================================

Peris 씀:

코드:

    if (strpos($accessInfo['fullpath'],$accessInfo['root']) !== 0)
        $accessInfo['fullpath'] = $accessInfo['root'].substr($accessInfo['fullpath'], strlen($accessInfo['root']) - 1);

rewrite.php 18번째 라인에 위와 같은 부분이 있는데 이 부분이 문제군요.
제가 잘못 이해한건지는 모르겠지만 저 코드는 잘못 작성이 되어 있는거 같네요.
자세한건 다른 분이 설명드릴겁니다.

일단 기존 코드는 유지하면서 해결하려면 아래 코드를 위의 코드 윗줄에 넣어주세요.

코드:

    if (strpos($accessInfo['fullpath'],$accessInfo['root']) === false)
        $accessInfo['fullpath'] = $accessInfo['root'].substr($accessInfo['fullpath'], 1);


[원문] http://forum.tattersite.com/ko/viewtopic.php?id=5132
==================================================================================

2008/04/01 21:46 2008/04/01 21:46

.htaccess의 예

php_flag register_globals on
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} !^(www)\.domain\.co\.kr$ [NC]
RewriteRule (.*) http://www.domain.co.kr/$1 [R=301,L]
ErrorDocument 401 http://www.domain.co.kr/401error.html


간단하게 요정도?
난 RewriteCond와 RewriteRule에 대해서만 언급해보려한다.
RewriteEngine On은 Rewrite모듈의 사용을 위해 기본적으로 On으로 설정해두는것이 좋다.
RewriteBase는 기본적으로 .htaccess가 위치안 물리적 경로로 설정하지만 Rewrite의 쓰임이 너무 광범위하기에 다르게 쓰이는 경우도 많다.
그 외에 RewriteOptions, RewriteLog, RewriteLogLevel, RewriteLock, RewriteMap등은 심화과정이므로 취급하지 않습니다 ^^;;

이 글은 완벽하지 않다. 잘쓴 글도 아니고 잘 되어있는 글도 아니다.
하지만 당신이 컴퓨터에 대한 열정이 있고 그만큼의 노력이 있었으며 독학에 재능이 있다면 이정도의 글로도 만족할것이라 믿는다. (쓸데없는 잡담이 너무 많은거 뺴고... ㅡㅡ;;)

이제 본론으로 고고-


Rewrite모듈은 URL Rewrite 엔진일까?

RewriteCond와 RewriteRule의 기본 형태
RewriteCond와 RewriteRule의 기본 형태는 이렇다.
RewriteCond     TestString     CondPattern
RewriteRule     Pattern     Substitution

RewriteCond는 RewriteRule을 위해 존재하기도 하지만 RewriteRule은 RewriteCond를 위해 존재하기도 한다.
하지만 순서는 거의 대부분 Cond후에 Rule이 온다.
Cond는 생략하고 Rule만 있는경우도 많다.
기본형태는 이러하지만 RewriteCond만 있을수도 있고 RewriteRule만 있을수도 있으며 둘다 여러개일수도 있고 둘중 하나만 여러개일수도 있다. 순서도 맘대로라서 엄청나게 다양한 수법이 가능하다 ㅋ

처리 경로(흐름)
제일 먼저 Rule의 Pattern에 어긋나지 않는다면 Cond의 TestString으로 가서 조건검사를 시작한다. 그후 CondPattern을 지나 Substitution으로 처리되어 조건에 만족하게 된다.

다음을 보자

...
RewriteRule     Pattern     Substitution

RewriteCond     TestString     CondPattern
RewriteRule     Pattern     Substitution

RewriteRule     Pattern     Substitution
...

위의 경우 Cond와 Rule이 막 써있다 ㅋ 두개 이상의 Rule이 있을경우 위  Rule이 처리, 적용된 결과가 다시 두번째 Rule에 적용된다. 또 아래 Rule이 있다면 그 결과가 다시 검사될것이다.
혹은. 위의 조건에 맞지 않는 값이라면 다음 Rule로 넘긴다.


이하부터는 패턴, 대용(대체), 조건패턴등의 한글화를 섞어 쓰겠다.
Cond는 조건의 약자이고 Rule은 그대로 규칙, 법이다.

특수 문자
프 로그래밍을 하면서 그 프로그램 내부 코드나 명령어로 쓰이고 있어서 쓰지 못하는 문자가 많다. 여기서도 마찬가지이다. 하지만 어디서나 존재하는 Escape문자 있으니 여기서는 "\"(역슬래쉬(원))표시가 쓰인다. 보통 .이 잘못쓰일것을 대비하여 \.로 쓰는게 보통이다.
예 : domain.co.kr   ==>   domain\.co\.kr
주로 점.이나 대괄호[], 괄호()등에 쓰인다.

RewriteCond
RewriteCond의 기본 구문은 이미 위에서도 나왔다.
그곳 Test스트링부분에 $N이나 %N이 쓰인다면 역참조 기능을 제공하게된다.
여기서 N은 (1<=N<=9)이다.
$N의 경우 현재 처리되고있는 Rule에서 가르키고 있는 패턴이 그룹으로 묶여 제공된다.
$N을 하나의 변수처럼 사용할수 있게되는것이다.
아래도 나와있지만 괄호로 그룹을 묶은 부분이 변수로 사용된다.

RewriteCond   %{HTTP_HOST}             ^[^.]+\.domain\.co\.kr$
RewriteRule   ^(.+)                     %{HTTP_HOST}$1 [C]
RewriteRule   ^([^.]+)\.domain\.co\.kr(.*)   /home/$1/htdocs$2

위 예제의 경우 도메인 앞의 URI를 $1로 그 뒤 경로를 $2로 지정하여 특정 디렉토리의 내용을 읽도록 하는 내용이다.
이것을 짧게 한줄로 고쳐보자면

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

요정도?

%N은 현재 처리중인 Cond에서 가르키고있는 조건과 일치한 패턴이 그룹으로 묶여 제공된다.
이건 잘 안쓰이는것같아서 정말 잘쓰이는 다음으로 패쓰~

%{Name}의 경우 해당 서버의 변수를 가지고 올수있다.
변수의 개수는 정말 엄청나게 많다. 하지만 자주 쓰이는 변수들은 아래를 통해서 한번 확인해보세요 ^^

Server Name : domain.com
Protocol : HTTP/1.1
Server Port : 80
Method : GET
Servlet Path : /index.php
Remote Host : 192.168.0.4
Remote Port : -1
Remote Address : 192.168.0.4
Content Length : 0
Header_Accept : text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Header_User-Agent : Mozilla/5.0 (Windows; U; Windows NT 5.1; ko; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12
Header_Referer : null
Local Name : domain.com
Local Port : 80
Locale : ko_KR
Scheme : http
Request URI : /index.php

Request URL : http://domain.com/index.php


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

-d     =>     디렉토리를 뜻한다.
결론적으로 Test스트링이 디렉토리를 가리키거나 포함하고 있을때 처리된다.
-f     =>     파일을 뜻한다.
Test스트링이 파일을 가리키거나 포함하고 있을때 처리된다.
-l     =>     심볼릭링크를 뜻한다.
Test스트링이 심볼릭링크를 가리키거나 포함하고 있을때 처리된다.
심볼릭 링크가 뭐냐고 물으신다면 리눅스나 유닉스를 공부해보세요 ^^ 라고 답하고 싶다^^

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

 

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ http://test.domain.co.kr/$1

위의 예제는 Request내용이 디렉토리나 파일을 가르키고 있지 않을경우 저쪽 사이트로 돌리라는 뜻. ^^
$1로 하위주소는 유지하려하고 있습니다 ^^

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

F     =>     403에러 Forbidden페이지로 된다.
L     =>     Last라는 뜻입니다. 위의 Cond들은 여기까지만 적용된다
아래부터는 새로 시작 되겠지용~
N     =>     새로운 Rule이 시작된다는 깃발.
QSA     =>     Cond의 대용을 지난 결과에 덧붙인다.
NE     =>     Out될 값에 특수문자가 HexCode로 되어 포함되어있는경우
R     =>     리다이렉션. 무조건 넘긴다. 뒤 주소로 넘긴다는 뜻이지요 ^^
NC     =>     대소문자 구별없다는 뜻.
OR     =>     프로그래밍의 or와 비슷하다.


아래를 참고하시죠 ^^

RewriteCond %{REMOTE_HOST}  ^domain.*  [OR]
RewriteCond %{REMOTE_HOST}  ^DOMAIN.*  [OR]
RewriteCond %{REMOTE_HOST}  ^DOMAIN2.* [NC]
RewriteRule ^(.*)$ http://www.domain.co.kr/$1 [R,L]

domain나 DOMAIN나 DOMAIN2나 domain2로부터 접속한 접속에 대하여 리다이렉트한다. http://www.domain.co.kr/로 접속하게된다. 보통 IP주소를 적게되겠다.

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

텍스트

.     =>     ?과 같습니다. 무엇이든 하나의 문자를 뜻합니다. A가 될수도 있고 Z가 될수 있다. 반드시 한글자.
[A]     =>     역시 하나의 문자가 올수 있다는 뜻. ex) a[eo]t => aot 혹은 aet
[^A]     =>     문자는 올수 없다는 뜻~ A부터 Z까지~



 

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



그룹

(텍스트)     =>     위의 텍스트에 속한 세가지를 조합하여 쓸수 있다
예로 (..)는 두글자라는 거지요 ^^
몇번째 그룹이냐에 따라서 위에 설명한 $N의 변수로 불러 쓸수있니다.



Anchors

^     =>     줄의 시작을 나타낸다 ex) ^a => a로 시작
$     =>     줄의 끝을 말한다. ㄷㅌ) a$ => a로 끝



2008/03/31 21:10 2008/03/31 21:10
htaccess란?

.htaccess (hypertext access)는 Apache 웹 서버의 디렉토리 레벨을 설정하는 기본 파일입니다. .htaccess는 한 특정 디렉토리에 위치하며, 모든 하위 디렉토리를 포함한 해당 디렉토리에 영향을 미칩니다. 이 파일이 위치한 특정 폴더에 사용자가 정의한 Request 기능을 적용합니다. 파일 이름은 .(dot)으로 시작하기 때문에 유닉스 계열의 운영체제에서는 숨김 파일로 저장됩니다.

.htaccess의 파일명을 다르게 사용하고 싶다면, AccessFileName 지시어를 사용하여 변경할 수있습니다. 예를 들어, .config 파일명을 사용하려면 서버 설정파일(httpd.conf)에 다음과 같이 추가 해야합니다.

AccessFileName .config


AllowOverride 지시어가 이 파일에 나올 수 있는 내용을 결정합니다. 이 지시어는 .htaccess 파일에서 허용하는 지시어 분류를 지정합니다.

.htaccess가 필요한 경우

일반적으로 주서버파일에 접근할 수 있는 경우 .htaccess 파일을 사용하면 안됩니다. 예를 들어 사용자 인증이 항상 .htaccess 파일에 있어야 한다는 것은 잘못 알려는 오해입니다. 이는 사실이 아닙니다. 주서버설정에 사용자 인증을 적을 수 있고, 사실 이 방법을 권장합니다. .htaccess 파일은 컨텐츠 제공자가 디렉토리별로 서버 설정을 다르게하고 싶지만 서버 시스템에 루트 권한이 없는 경우에 사용합니다. 서버 관리자가 설정을 자주 변경하고 싶지 않은 경우 일반 사용자가 직접 .htaccess 파일을 수정하도록 허용하는 것이 바람직합니다. 예를 들어, 한 컴퓨터에 여러 사용자 사이트를 서비스하는 ISP에서 사용자가 자신의 설정을 변경하고 싶은 경우가 있습니다.

그러나 일반적으로 .htaccess 파일을 가급적 피해야 합니다. .htaccess 파일에서 허용하는 지시어는 주설정파일의 <Directory> 섹션과 같은 효과가 있습니다. 다음 두 가지 큰 이유 때문에 .htaccess 파일 사용을 피해야 합니다.

AllowOverride가 .htaccess 파일을 사용하도록 허용하면, Apache는 디렉토리마다 .htaccess 파일을 찾습니다. 그래서 .htaccess 파일은 문서를 요청할 때마다 읽어들입니다. 게다가 적용해야하는 전체 지시어를 모으기위해 Apache는 모든 상위 디렉토리에서 .htaccess 파일을 찾습니다. 그래서 /www/htdocs/example 디렉토리에 있는 파일을 요청하면 Apache는 다음 파일들을 찾아야 합니다.
/.htaccess
/www/.htaccess
/www/htdocs/.htaccess
/www/htdocs/example/.htaccess
그래서 그 디렉토리에 있는 파일을 접근할 때마다 설정파일이 전혀 없어도 파일 시스템을 4번 더 접근해야 합니다.
사용자에게 서버 설정 변경 권한을 주면 당신이 감당할 수 없는 변화가 일어날 수 있습니다. 사용자에게 이런 권한을 줄 지 곰곰이 생각해 보세요. 또, 사용자가 원하는 것보다 적은 권한을 주면 기술지원요청이 들어옵니다. 사용자에게 가능한 권한 수준을 명확히 알려야합니다. 사용자에게 AllowOverride를 어떻게 설정하였는지 정확히 알리고 관련 문서를 제공하면 앞으로 혼란을 피할 수 있습니다.


.htaccess 사용법

.htaccess에서 가장 많이 사용되는 기능은 Rewrite engine입니다. Rewrite는 사이트의 URL을 순회시켜주는 아주 유용한 기능입니다. 예를 들어, http://localhost/naver로 접속을 했을 때 http://www.naver.com로 접속이 가능하도록 할 수있습니다.

.htaccess에서 Rewrite engine의 모든 기능을 사용하기 위해서는 파일 상단에 "RewriteEngine On"을 위치시켜 주어야 합니다.

RewriteEngine On
...
..
.......
.htaccess에서 사용 가능한 기본적인 Rewrite 구문은 RewriteRule과 RewriteCond입니다. RewriteRule은 URL을 전환해주는 가장 기본적이고 가장 중요한 구문입니다. RewriteCond는 URL에 입력된 조건을 입력하는 구문입니다.

RewriteRule과 RewriteCond의 기본적인 패턴은 다음과 같습니다.
RewriteRule Pattern Substitution
RewriteCond TestString CondPattern
RewriteCond는 RewriteRule을 위해 존재하기도 하지만 RewriteRule은 RewriteCond를 위해 존재하기도 합니다. 하지만 순서는 거의 대부분 RewriteCond 후에 RewriteRule이 옵니다. 또한 RewriteCond를 생략하고 바로 RewriteRule을 사용하는 것도 가능합니다. 다음 예시를 봅시다.

......
RewriteEngine On
......
RewriteRule Pattern Substitution
 
RewriteCond TestString CondPattern
RewriteRule Pattern Substitution
 
RewriteRule Pattern Substitution
......
두 개 이상의 Rule이 있을 경우 위쪽에 위치한 RewriteRule이 처리하여 적용된 결과가 다시 두번째 RewriteRule에 적용이 됩니다.

.htaccess에서의 특수문자
프로그래밍을 하면서 그 프로그램 내부 코드나 명령어로 쓰이고 있어서 쓰지 못하는 문자가 있습니다. 그래서 역슬래시(\)를 사용하여 모든 문자를 사용할 수 있습니다. 주로 점(dot, .)이나 대괄호([]), 괄호( ()) 등에 쓰입니다.

정규표현식 기초
.: 다수의 한문자

?: 0개 이상의 한문자

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

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

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

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

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

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

{n}: 정확히 n번 반복

{n,}: n번 이상 반복

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

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

예) [a-z]: a 부터 z 까지의 소문자, [tT] : 소문자 t 또는 대문자 T
정규표현식 단축표현들
[:alpha:] : 알파벳. [a-zA-Z] 와 같은 표현
 
[:alnum:] : 알파벳과 숫자. [a-zA-Z0-9] 와 같은 표현
 
[:digit:] : 숫자 [0-9] 와 같은 표현
 
[:upper:] : 대문자. [A-Z] 와 같은 표현
RewriteCond, RewriteRule
RewriteCond와 RewriteRule의 기본 구문은 이미 위에서 설명하였습니다.
TestString 부분에 $N이나 %N이 쓰인다면 역참조 기능을 제공하게 됩니다. 여기서 N은 1≤N≤9입니다.
RewriteRule에서 $N을 사용하게 되면 하나의 변수처럼 패턴에 일치하는 문자열을 사용할 수 있습니다.
아래와 같이 사용이 가능합니다.
RewriteCond %{HTTP_HOST} ^[^.]+\.domain\.co\.kr$
RewriteRule ^(.*?) %{HTTP_HOST}$1 [C]
RewriteRule ^([^.]+)\.domain\.co\.kr(.*) /home/$1/htdocs$2
위 예제의 경우 도메인 앞의 URI를 $1, 그 뒤 경로를 $2로 지정하여 특정 디렉토리의 내용을 읽도록 합니다.
위의 것을 짧게 사용하고 싶다면 아래와 같이 가능합니다.
RewriteRule ^([^.]+)\.domain\.co\.kr(.*) /home/$1/htdocs$2
RewriteCond
RewriteCond에서 쓰이는 명령어를 알아보도록 하겠습니다.
-d: 디렉토리를 의미합니다. TestString이 이렉토리를 가리키거나 포함하고 있을 때 처리됩니다.

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

-l: 심볼릭링크를 의미합니다. TestString이 심볼릭링크를 가리키거나 포함하고 있을 때 처리됩니다.

마지막으로 느낌표(!)는 부정을 뜻합니다.
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ http://test.domain.co.kr/$1
위 예제는 Request 내용이 디렉토리나 파일을 가리키고 있지 않을 경우 저쪽 사이트로 접속하게 만들라는 의미입니다. $1로 하위주소는 유지하고 있습니다.

Flag
라인마다 Flag라 불리는 기능을 사용할 수 있습니다.
F: 403 Forbidden 에러 페이지를 출력합니다. 접근 권한이 없다는 의미입니다.

L: Last(마지막)를 의미합니다. 이곳에서 Rewrite가 끝납니다.

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

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

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

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

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

OR: 프로그래밍의 or와 비슷합니다.
위의 Flag들을 사용하여 아래와 같은 예제가 탄생했습니다!
RewriteCond %{REMOTE_HOST}  ^domain.*  [OR]
RewriteCond %{REMOTE_HOST}  ^DOMAIN.*  [OR]
RewriteCond %{REMOTE_HOST}  ^DOMAIN2.* [NC]
RewriteRule ^(.*)$ http://www.domain.co.kr/$1 [R,L]
domain, domain2, DOMAIN, DOMAIN2로부터 접속한 경우 Redirect합니다. http://www.domain.co.kr로 접속하게 됩니다.

지금까지 Apache 웹 서버에서 .htaccess 파일을 이용하는 방법과 그 중에서 Rewrite 기능을 사용하는 방법에 대해서 알아보았습니다. 긴 글을 읽어주신 여러분께 감사합니다 ^^



[원문] http://www.beneglo.com/45
2008/03/31 21:09 2008/03/31 21:09
[원문] http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=35182&sca=&sfl=wr_subject%7C%7Cwr_content&stx=RewriteRule&sop=and 

음...대략 주소를 짧게?? -0-;;;;
음....예를 들면
http://www.zekill.pe.kr/drz/board/list.php?bs=4&ps=0&stp=&stx=&sc=0&pg=1
뭐 이런 주소를....

http://www.zekill.pe.kr/drz/board/41
뭐 이런식으로....라고 해야하나...-0-;;;

대략 네이버 야후 뭐 이런 곳의 블로그 스타일 주소를 보면 이해 될듯....

실제로 그런 포탈에서 이걸 이용할지는 모르겠으나 이 모듈을 이용해
그와 비슷하게 따라할수는 있다는....-0-;;;;

테스트는 안해봤다는....-0-;;;

==================================================


[서버운영] 아파치 REWRITE 모듈 사용법

작성자 : 윤 일

Apache rewrite Module


Apache 는 추가적으로 사용할 수 있는 유용한 모듈들을 제공합니다.

이번강좌에서는 Apache의 URL Rewrite 모듈을 사용하기 위한 컴파일,설치 와 httpd.conf의 설정방법 그리고 활용방법에 대해 알아보겠습니다.



Apache 다운로드 : http://www.apache.org

1. rewrite 모듈을 사용하기 위한 Apache 컴파일옵션

Rewrite 모듈을 쓰기위한 Apache 컴파일 옵션은 --enable-rewrite 입니다.

Configure 실행시에  --enable-rewrite 만 추가하시면 Apache에서 rewrite 모듈을 사용할 있게 됩니다.

[root@superuser root]# ./cofigure prefix=/usr/local/apache2 --enable-rewrite

[root@superuser root]# make

[root@superuser root]# make install



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

Rewrite 설정은 Server Config, Virtual Host, Directory, .htaccess 에 설정할 수 있습니다.

즉 Apache 서버 전체에 Global 설정과 특정 가상호스트에만 적용하도록 할수 있고 특정 디렉토리에만 적용시킬수도 있습니다.



2. Rewrite 모듈 지시자

RewriteEngine
설정문법 : RewriteEngine On|Off

Rewriteing 엔진을 사용할지 여부를 설정합니다. 기본설정은 당연히 Off로 되어 있으며 RewriteEngine On 으로 설정하지 않는 이상 Rewritng 엔진을 활성화 시키지 않습니다.



현재 Apache에서 실행중인 모든 RewriteRule을 비활성화 시킬 때 RewriteRule 라인을 주석처리 하기보다 RewriteEngin Off 로 설정하는 것이 더 간편하고 올바른방법입니다.



RewreteLog
설정문법 : RewriteLog FILE-PATH

RewriteLog 지시자는 Rewrite 엔진의 로그를 그록할 파일을 지정합니다.
RewriteLog 파일을 항상 남기기 보다 잘못된 Rewrite 규칙들을 디버킹할 때 사용하기를 권장합니다. 아파치와 마찬가지로 RewriteLog 파일도 방문자수가 많은사이트에서는 감당못할 정도의 로그파일을 남기기 때문에 시스템 여유공간이 많이 없는 시스템에서는 해당 파티션의 하드사용률 100%로 인한 재앙(?)을 불러올수도 있습니다. 다음강좌에서 소개될 로그파일 분석에서 언급하겠지만 로그파일은 유용한 디버깅 도구가 될수 있지만 잘못 관리하면 시스템의 치명적인 악으로 존재할수도 있습니다.

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



RewriteLogLevel
설정문법 : RewriteLogLevel Level

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

기록할 로그 Level 은 0 ~ 9까지 사용할 수 있으며 0은 로그를 기록하지 않겠다는 의미입니다. Level 숫자가 높을수록 자세한 로그를 기록합니다



RewriteCond
설정문법 : RewriteCond TestStirng CondPattern

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



RewriteRule
설정문법 : RewriteRule Pattern Substitution

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

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

Pattern(Input URL) 에는 Perl 정규표현식을 사용할수 있기 때문에 Input URL 의 규칙을 유연하게 적용할 수 있습니다. 이 강좌에서는 기초적인 정규표현식 사용방법만 다루고 정규표현식에 대해 자세히 알고 싶으신 분은 정규표현식에 대한 강좌나 인터넷 문서를 참고하시기 바랍니다.



정규표현식 기초

. : 다수의 한문자

? : 0개 이상의 한문자

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

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

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

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

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

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

{n} : 정확히 n번 반복

{n,} : n번 이상 반복

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

[chars] : 문자들의 범위 또는 표현할 수 있는 문자들을 설정합니다.
예) [a-z] : a 부터 z 까지의 소문자, [tT] : 소문자 t 또는 대문자 T



정규표현식 단축표현들

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

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

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

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



RewriteRule 플래그

forbidden|F : 요청하는 페이지를 403 에러로 redirect 시킵니다. RedirectRule 이 적용되고 있는 페이지를 일시적으로 사용중단을 시키거나 사용자로 하여금 페이지 접근을 할수 없게 할 때 사용합니다.

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

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

gone|G : 요청하는 페이지를 410 에러로 redirect 시킵니다. 410 에러는 페이지가 사라&#51220;거나 존재하지 않는다는 메시지입니다. 이것도 forbidden 과 마찬가지로 RedirectRule 이 적용되던 페이지를 일시적으로 중단시킬 때 유용하게 사용할 수 있습니다.

last|L : 이 플래그가 적용되면 뒤에 어떤 룰이 있더라도 이룰 아래의 규칙들은 적용되지 않고 RewriteRule 을 빠져나가게 됩니다. C, Perl, PHP 프로그램에서 루프를 빠져나가는 break 와 같은 의미를 가집니다.

chain|C : 이 플래그의 결과를 다음 RewriteRule 의 input 값으로 사용합니다.
예)

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

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



이 룰은 사용자 홈의 도메인을 2차 도메인으로 자동설정해 줄 때 많이 쓰는 룰입니다. RewriteRule의 input은 도메인을 제외한 URI 를 인식하기 때문에 도메인까지 인식을 시켜서 다음 RewriteRule 로 체크를 하기 위해 사용한 것입니다.

즉 http://user_id.domain.com/hello.html 이란 요청이 들어오면  /home/user_id/public_html/hello.html 로 redirect 시켜줍니다. 위와 같이 2차 도메인을 이용해 계정 사용자의 홈을 지정하기 위해서는 DNS 세팅이 선행되어야 됩니다.



RwriteRule 설정예



1. http://yourdomain.com/user_id  ->  http://yourdomain.com/home.php?id=user_id



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

설명 : 도메인(http://yourdomain.com) 뒤에 오는 영문숫자로된 문자열을 지정하면서 그룹으로 묶었습니다. 이렇게 그룹으로 설정된 문자열 Pattern 은 Substitution(return URL) 에서 $1 이라는 변수로 받아 사용하게 됩니다. 즉 http://yourdomain.com/superuser 라는 페이지 요청이 들어오면 실제로는 http://yourdomain.com/home.php?id=superuser 라는 페이지로 redirect 시켜줍니다. 블로그나 카페(동호회) 사이트에서 블로그 사용자의 ID 로 개인 블로그 주소를 부여할 때 http://blog.com/user_id 로 부여해 주지만 실제 실행되는 파일은 이와 같이 redirect 시켜주는 경우가 많습니다.



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

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

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





RewriteOptions
설정문법 : RewriteOptions Options

현재 사용할 수 있는 option 은 MaxRedirects=number 를 사용할 수 있으며 설정된 number값에 도달하게 되면 500 Internal Server Error 를 남기고 RewriteRule을 종료합니다. 잘못된 RewriteRule에 의한 무한 루프를 방지하기 위한 목적으로 사용되는데 시스템이 이유없이 다운된다거나 할 때 이 옵션과 Log 기록을 참고하여 디버깅 및 시스템 다운을 방지할 수 있습니다.

이 지사자는 Apache 2.0.45 이상에서 사용할 수 있습니다.



3. 실제 적용예

가상호스트 blog.xxx.ac.kr 에 대해 Rewrite Rule을 적용한 예입니다. 이 부분은 실제 운영되는 블로그 사이트를 위해 RewriteRule 을 적용한 예입니다.


DocumentRoot /home/blog/html

ServerName blog.xxx.ac.kr

# 여기까지는 일반적인 가상호스트 설정입니다.

RewriteEngine on

# RewriteRule을 사용하기 위해 On 으로 설정합니다.



RewriteLog /home/blog/rewrite_log_admin3.log

RewriteLogLevel 9

# Rewrite 실행중 Log를 남기기 위해 로그파일과 로그레벨을 지정했습니다.



RewriteRule ^/tb/([a-zA-Z0-9]+)/([0-9]+)$ /home/blog/html/blog/trackback\.php\?id=$1&post_no=$2

# 위설정은 블로그에 등록된 포스트의 트랙백 주소를 부여하기 위해 설정한 RewriteRule 로써 Pattern에 두개의 그룹이 존재하고 return URL에 순서대로 각 그룹을 $1 과 $2 로 받아 GET 변수로 치환한것입니다.



RewriteRule ^/xml/([a-zA-Z0-9]+)$ /home/blog/html/blog/rss_feed\.php\?id=$1

# 각블로그별 RSS 주소를 실제 파일로 지정한것입니다.



RewriteCond %{REQUEST_URI}     !^/admin$

RewriteRule ^/([a-zA-Z0-9]+)$ /home/blog/html/blog/main\.php?id=$1

# 먼저 RewriteCond 로 실제 존재하는 admin 이라는 디렉토리를 이어지는 RewriteRule에서 제외시키고 http://domain.com/user_id 로의 요청을 모두 /home/blog/html/blog/main.php?id=user_id로 redirect 시키는 룰입니다.



RewriteRule ^/([a-zA-Z0-9]+)/([0-9]+)$ /home/blog/html/blog/main\.php\?id=$1&post_no=$2

# /user_id/1345 로 요청하는 페이지를 /home/blog/html/blog/main.php?id=user_id&post_no=1345 로 redirect 시키는 룰입니다.




4. 마치면서

위에서 언급한 RewriteRule 뿐만 아니라 여러가지 상황에서 RewriteRule을 잘 활용한다면 아주 유용하게 웹페이지를 컨트롤 할수 있습니다. RewriteRule 을 세팅하기 이전에 반드시 정규표헌식에 대해 어느정도 공부한후 적용해 보실 것을 권합니다.
=================================================================

아라치    04-11-10 07:54  
즉 http://yourdomain.com/superuser 라는 페이지 요청이 들어오면 실제로는 http://yourdomain.com/home.php?id=superuser 라는 페이지로 redirect 시켜주는데 브라우져 주소창에다가.. http://yourdomain.com/superuser  요거를 유지할려면 어떤 옵션이 별도로 있나요? 주소가 바뀌어버리는데...  

즉 http://yourdomain.com/superuser 라는 페이지 요청이 들어오면 실제로는 http://yourdomain.com/home.php?id=superuser 라는 페이지로 redirect 시켜주는데 브라우져 주소창에다가.. http://yourdomain.com/superuser  요거를 유지할려면 어떤 옵션이 별도로 있나요? 주소가 바뀌어버리는데...
 
   지나가다    04-11-10 19:42  
끝에 [L] 넣어주면 주소 안변해용. 얌얌.
2007/09/01 23:35 2007/09/01 23:35