.htaccess Rewriterule 사용하는법

munilive
Written by munilive on (Updated: )
  1. rewrite 모듈을 사용하기 위한 Apache 컴파일옵션
    Rewrite 모듈을 쓰기 위한 Apache 컴파일 옵션은 –enable-rewrite 입니다.
    Configure 실행 시에 –enable-rewrite 만 추가하면 Apache에서 rewrite 모듈을 사용할 수 있게 됩니다.

    ./cofigure prefix=/usr/local/apache2 –enable-rewrite
    make
    make install
    
  2. Rewrite 를 적용할 수 있는 범위
    Rewrite 설정은 Server Config, Virtual Host, Directory, .htaccess에 설정할 수 있습니다.
    즉 Apache 서버 전체에 Global 설정과 특정 가상호스트에만 적용하도록 할수 있고 특정 디렉토리에만 적용시킬수도 있습니다.

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

  4. 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의 규칙을 유연하게 적용할 수 있습니다.
  5. 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
  6. 정규표현식 단축표현들
    • [:alpha:] : 알파벳. [a-zA-Z] 와 같은 표현
    • [:alnum:] : 알파벳과 숫자. [a-zA-Z0-9] 와 같은 표현
    • [:digit:] : 숫자 [0-9] 와 같은 표현
    • [:upper:] : 대문자. [A-Z] 와 같은 표현
  7. 사용가능한 서버변수
    • [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
  8. RewriteCond에서 쓰이는 명령어
    • -d: 디렉터리를 의미합니다. TestString이 디렉터리를 가리키거나 포함하고 있을 때 처리됩니다.
    • -f: 파일을 의미합니다. TestString이 파일을 가리키거나 포함하고 있을 때 처리됩니다.
    • -l: 심볼릭링크를 의미합니다. TestString이 심볼릭링크를 가리키거나 포함하고 있을 때 처리됩니다.
    • !: 느낌표(!)는 부정을 뜻합니다.

       # 파일이 아닌 경우
       RewriteCond %{REQUEST_FILENAME} !-f
       # 디렉토리가 아닌 경우
       RewriteCond %{REQUEST_FILENAME} !-d
       RewriteRule ^(.*)$ http://test.domain.co.kr/$1
      
  9. 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

Comments

comments powered by Disqus