.htaccess Rewriterule 사용하는법
Written by munilive on (Updated: )rewrite 모듈을 사용하기 위한 Apache 컴파일옵션
Rewrite 모듈을 쓰기 위한 Apache 컴파일 옵션은–enable-rewrite
입니다.
Configure 실행 시에–enable-rewrite
만 추가하면 Apache에서 rewrite 모듈을 사용할 수 있게 됩니다../cofigure prefix=/usr/local/apache2 –enable-rewrite make make install
Rewrite 를 적용할 수 있는 범위
Rewrite 설정은Server Config
,Virtual Host
,Directory
,.htaccess
에 설정할 수 있습니다.
즉 Apache 서버 전체에 Global 설정과 특정 가상호스트에만 적용하도록 할수 있고 특정 디렉토리에만 적용시킬수도 있습니다..htaccess란?
.htaccess (hypertext access)
는 Apache 웹 서버의 디렉토리 레벨을 설정하는 기본 파일입니다..htaccess
는 한 특정 디렉토리에 위치하며, 모든 하위 디렉토리를 포함한 해당 디렉토리에 영향을 미칩니다.
이 파일이 위치한 특정 폴더에 사용자가 정의한 Request 기능을 적용합니다.
파일 이름은.(dot)
으로 시작하기 때문에 유닉스 계열의 운영체제에서는 숨김 파일로 저장됩니다.Rewrite 모듈 지시자
- RewriteEngine
- 설정 문법:
RewriteEngine On|Off
- Rewriteing 엔진을 사용할지 여부를 설정합니다.
기본설정은 당연히 Off로 되어 있으며RewriteEngine On
으로 설정하지 않는 이상 Rewritng 엔진을 활성화하지 않습니다.
현재 Apache에서 실행 중인 모든 RewriteRule을 비활성화시킬 때 RewriteRule 라인을 주석처리 하기보다RewriteEngin Off
로 설정하는 것이 더 간편하고 올바른 방법입니다.
- 설정 문법:
- RewriteLog
- 설정 문법:
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)을 Substitution(Return URL)로 변경하기 위한 모든 규칙은 이 지시자를 사용해서 설정해야 합니다.
Pattern(Input URL)에는 Perl 정규표현 식을 사용할 수 있기 때문에 Input URL의 규칙을 유연하게 적용할 수 있습니다.
- 설정 문법:
- RewriteEngine
- RewriteRule 에서 사용되는 정규 표현식의 기초
.
: 다수의 한문자?
: 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]
와 같은 표현
- 사용가능한 서버변수
- [HTTP Headers]
- HTTP_USER_AGENT
- HTTP_REFERER
- HTTP_COOKIE
- HTTP_FORWARDED
- HTTP_HOST
- HTTP_PROXY_CONNECTION
- HTTP_ACCEPT
- [connection & request]
- REMOTE_ADDR
- REMOTE_HOST
- REMOTE_PORT
- REMOTE_USER
- REMOTE_IDENT
- REQUEST_METHOD
- SCRIPT_FILENAME
- PATH_INFO
- QUERY_STRING
- AUTH_TYPE
- [server internals]
- DOCUMENT_ROOT
- SERVER_ADMIN
- SERVER_NAME
- SERVER_ADDR
- SERVER_PORT
- SERVER_PROTOCOL
- SERVER_SOFTWARE
- [date and time]
- TIME_YEAR
- TIME_MON
- TIME_DAY
- TIME_HOUR
- TIME_MIN
- TIME_SEC
- TIME_WDAY
- TIME
- [specials]
- API_VERSION
- THE_REQUEST
- REQUEST_URI
- REQUEST_FILENAME
- IS_SUBREQ
- HTTPS
- [HTTP Headers]
- RewriteCond에서 쓰이는 명령어
-d
: 디렉터리를 의미합니다. TestString이 디렉터리를 가리키거나 포함하고 있을 때 처리됩니다.-f
: 파일을 의미합니다. TestString이 파일을 가리키거나 포함하고 있을 때 처리됩니다.-l
: 심볼릭링크를 의미합니다. TestString이 심볼릭링크를 가리키거나 포함하고 있을 때 처리됩니다.!
: 느낌표(!)는 부정을 뜻합니다.# 파일이 아닌 경우 RewriteCond %{REQUEST_FILENAME} !-f # 디렉토리가 아닌 경우 RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ http://test.domain.co.kr/$1
- 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 와 같은 의미를 가집니다.
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 세팅이 선행되어야 합니다.
N
- 새로운 Rule이 시작된다는 의미입니다.
R
- Redirection. 무조건 넘깁니다. 뒤 주소로 넘긴다는 의미입니다.
NC
- 대소문자를 구별하지 않습니다.
OR
- 프로그래밍의 or와 비슷합니다.
QSA
- Cond의 내용을 지난 결과에 덧붙입니다.
NE
- Out 될 값에 특수문자가 HexCode로 되어 포함된 경우
출처: http://apmusers.com/tt/dbckdghk/95
참고할만한 다른글: http://www.superuser.co.kr/apache/rewrite_Module/Apache_rewrite_Module.htm