====== 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]''을 내포한다.