티스토리 뷰

카테고리 없음

mod_rewrite

Khongchi 2013. 6. 26. 17:16

mod_rewrite

  • url주소를 정규표현식을 사용하여 바꾸어 주는 모듈
  • Server Config, Virtual Host, Directory, .htaccess에 사용 가능
  • RewriteEngine on/off 으로 사용 여부를 설정
  • RewriteLog File_path 로 로그를 기록할 파일 지정, RewriteLogLevel과 함께 써야함
  • RewriteLogLevel level(0~9) 로 로그를 기록할 레벨 지정, 0은 기록 안함이고 높을수록 자세히
  • RewriteBase / 기본 디렉토리를 /로 설정
  • RewriteCond targetString ConditionPattern 으로 RewriteRule을 적용할 주소 선택. TargetString이 Condition pattern과 일치해야 RewriteCond아래의 RewriteRule을 실행한다.
    • –d는 디렉토리 –f는 파일 –l은 심볼릭링크이고 !-f하면 파일이 아닌 것을 말한다.
    • RewriteCond %{REQUEST_FILENAME} !-f 은 request가 파일을 안 가리키면, 밑의 RewriteRole을 따르라는 뜻
  • RewriteRule pattern(inputURL) Substitution(outputURL) 실질적인 rewrite룰을 정하는 지시자 perl의 정규표현식 사용
  • 사용시 플래그 ex) RewriteRule ^/test /home/blog/html/test.php [F]
    • Forbidden | [F] 403에러로 redirect시킴
    • Gone | [G] 410에러로 redirect시킴
    • Proxy | [P] proxy request로 보냄
    • Last | [L] 뒤에 어떤 룰이 있더라도 적용되지않고 rewrite룰을 빠져나옴, break같은 효과. 아래부터는 새로운 룰 시작
    • Next | [N] 새로운 룰 시작
    • Chain | [C] 이 플래그의 결과를 다음 RewriteRule의 input값으로 사용
      1. RewriteRule ^(.+) %{HTTP_HOST}$1 [C]
      2. RewriteRule ^([^.]+)\.domain\.com(.*) /home/$1/public_html$2
      3. RewriteRule의 input은 도메인을 제외한 URI이기 때문에 체인은 홈의 도메인을 2차 도메인으로 자동 설정해 줄 때 많이 쓴다.
      4. 만약 http://user_id.domain.com/hello.html 이란 요청이 들어오면 /home/user_id/public_html/hello.html 으로 redirect 시켜준다.
      5. 우선 1번의 ^(.+)에서 ^는 (.+)로 시작되는 문자열이라는 뜻(^a는 a로 시작하는 문자열)이고 .은 아무 것이나 문자 하나를 뜻이다. +는 1개나 그 이상의 문자를 뜻한다. 즉 아무 문자 한 개나 아무 문자 여러 개로 시작되는 문자열이라는 것이다. ()로 묶인 문자열은 $1, $2와 같이 $몇번째()로묶인문자열 변수로 받아 사용된다. input으로 “/hello.html”만 받기 때문에 도메인 뒤에 input문자열을 $1으로 붙여서 체인 플래그 [C]를 사용하여 만든 결과를 다음 rewirteRule으로 넘긴다.
      6. 그리고 2번의 rewriteRule에서는 ([^.]+)를 사용한다. []는 []안에 들어있는 문자 중에 하나이고([ab]는 a이거나b) []안에서는 +.*등의 특수문자가 적용되지 않지만 ^는 not의 의미로 적용된다. 원래 .은 아무 문자 하나를 뜻하지만 [] 안에서 [^.]은 .이 아닌 아무 문자라는 뜻이고 [^.]+는 .이 아닌 어느 문자 한 개 or 몇 개이다. ([^.]+)으로 ‘.’이 아닌 문자열 즉 “user_id”를 변수 $1에 넣는다. *은 문자 0개 또는 그 이상이라는 뜻이다 (.*)는 아무 문자 0개 또는 그 이상인 문자열으로 ~.com다음의 “/hello.html”를 받아서 $2에 넣어준다.
    • Redirect | [R=code] Substitution으로 redirect됨
      1. 코드
      2. 301 moved permanently
      3. 302 moved temporarily
      4. 403 forbidden
      5. 404 not found
      6. 410 gone
    • Passtrough | [PT] 문자열을 처리하고 다음 핸들러로 후처리 하도록 넘긴다. rewrite한 후에 브라우저에 rewirte처리한 문자열이 아닌 원래 문자열이 남는다.
    • Case insensitive | [NC] 대소문자 구분 안 함
    • 한번에 두 플래그 쓰려면 [R=301,NC] 처럼 사용가능
  • RewriteOptions Maxredirects=number 으로 설정된 number값에 도달하면 500 Internal Server Error를 남기고 RewriteRule을 종료한다.
  • RewirteMod Mapname maptype:MapSource 로 url을 maptype으로 Mapsource를 읽어서 mapping한다.
    • 사용법
      1. ${MapName:LookupKey}
      2. ${MapName:LookupKey|DefaultValue}
      3. Ex) RewriteMap examplemap txt:/path/to/file/map.txt
      4. RewriteRule ^/ex/(.*) ${examplemap:$1}
      5. 4번에서 /ex/뒤의 문자열을 가지고 3번에서 examplemap의 map source인 map.txt에서 매칭된 url을 찾는다.
    • Type
      1. txt – plain text
        ex) RewriteMap real-to-user txt:/path/to/file/map.txt
      2. rnd – randomized plain text
        ex) RewriteMap servers rnd:/path/to/file/map.txt
      3. example
        ##map.txt #은 주석
        Static www1|www2|www3|www4
        Dynamic www5|www6
        RewriteMap servers rnd:/path/to/file/map.txt
        RewriteRule ^/(.*\.(png|gif|jpg)) http://${servers:static}/$1 [NC,P,L]
        RewriteRule ^/(.*) http://${servers:dynamic}/$1 [P,L]
        확장자가 png or gif or jpg이면 servers map.txt에서 static을 찾아서 www1, 2, 3, or www4 중에 랜덤하게 매칭
        확장자가 다른 것들은 dynamic으로 www5 or www6 –> 이 기능으로 로드밸런싱 할 수 있다.


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함