====== Apache mod_rewrite ====== * URL을 변경해서 요청하는 모듈 * [[http://httpd.apache.org/docs/current/mod/mod_rewrite.html|Apache mod_rewrite]] : 공식 문서 * [[http://www.yourhtmlsource.com/sitemanagement/urlrewriting.html|URL Rewriting | redirecting URLs with Apache’s mod_rewrite]] : 매운 간단한 mod_rewrite 소개 * [[http://blogs.sitepoint.com/apache-mod_rewrite-examples/|Learn Apache mod_rewrite: 13 Real-world Examples Article » SitePoint]] : 기초와 활용법을 배울 수 있는 문서 ===== 기본 ===== RewriteEngine on RewriteRule ^/?([a-zA-Z_]+)/([a-zA-Z_]+)/([a-zA-Z_]+)$ display.php?country=$1&state=$2&city=$3 [L] * URI 비교 대상은 {REQUEST_URI} 값이다. 쿼리 파라미터는 제외됨. * Apache 1.x 에서는 도메인 바로 뒤의 슬래시(/)를 정규표현식에 포함해야 했으나, 2.x 부터는 / 제외하고 매칭. * 둘 다 만족시키는 매칭 : **^/?** 로 시작하면 된다. * RewriteCond 를 통해 Apache 변수(variable)의 값을 조건별로 판단해서 룰을 적용할수 있다. RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC] RewriteRule .? http://www.example.com%{REQUEST_URI} [R=301,L] * RewriteCond 의 **!**은 not 을 뜻한다. 즉, www.example.com 이 **아닌** 다른 도메인으로 왔을 경우에 조건이 발동된다. ===== Flags ===== * [[http://httpd.apache.org/docs/current/rewrite/flags.html|플래그]]는 조건이나 규칙(Rule)의 끝에 [] 로 감싸서 넣는다. 여러 플래그가 들어갈 경우에는 쉼표(,)로 구분한다. * last|L : Rewrite 조건 블럭의 끝(last)를 뜻한다. mod_rewrite 자체를 끝내는 것은 아니다. * nocase|NC : regex 검사시 대소문자 구분 안함. * redirect:R : 몰래 rewrite하지 않고, 브라우저가 redirect하도록 한다. 기본 HTTP 302 응답(moved temporarily)을 보낸다. [R=301]로 하면 moved permanently 를 뜻한다(검색엔진이 인덱스를 다시 생성하게 함). * qsappend|QSA : Query String Appended. 현재 받은 쿼리 문자열을 재설정한 URL에도 동일하게 보낸다. * forbidden|F : HTTP 403 Forbidden 응답(페이지 제공 안함) * ornext|OR : 조건 생성시 logical OR 의 역할을 한다. * next|N : 마지막에 재생성된 URI를 기준으로 해서, 모든 mod_rewrite 조건을 처음부터 다시 체크한다. * passthrough|PT : 최종 생성된 결과를 파일 경로로 간주하지 않고 또 다른 URI로 간주한다. 이는 Alias, Redirect, ScriptAlias 등을 사용했을 경우에 꼭 필요하다. 이들은 존재하는 파일 경로를 가리키지 않는 URI를 만들어내기 때문이다. ===== 주석 달기 ===== RewriteEngine off Rewrite 관련 코드들... ... RewriteEngine on 위와 같이 하면 off 이하부터 on 이상 까지의 구문이 주석처럼 실행이 안된다. ===== 요청 금지 ===== RewriteEngine on RewriteRule \.exe - [F] * *.exe의 모든 요청을 금지한다. * ''[F]''는 자체적으로 더이상의 Rewrite를 중단하는 ''[L]''을 내포한다.