.htaccess Rewriterule 사용하는법
-
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의 규칙을 유연하게 적용할 수 있습니다.
- 설정 문법:
-
-
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
이 저작물은 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스 에 따라 이용할 수 있습니다.
Comments
Related Posts
php, css, js 파일 압축해서 보내기 (htaccess 이용)
.htaccess 설정과 PHP ob_gzhandler를 이용하여 gzip 압축 전달에 대한 글이다.
지정아이피의 접속을 제외한 모든 접속을 특정페이지로 보내기
.htaccess 설정으로 특정 IP의 접속을 제외한 모든 접속을 redirect 시키는 방법에 대한 글이다.
.htaccess 이용하여 타서버에서 이미지 링크 막기 (이미지 무단링크 방지)
apache의 .htaccess 파일 설정을 통해 내 도메인 외 다른 도메인에서의 접근을 제한하는 방법에 대한 설명 글이다.