# httpd.conf 파일 수정
# conf 파일 맨 상단에 아래 문구 추가
LoadModule rewrite_module modules/mod_rewrite.so
nano 또는 vi 명령어로 00-base.conf 파일을 연 후, 아래 문구를 추가하거나 주석 처리 된 것을 해제한다.
# 00-base.conf 파일 수정
LoadModule rewrite_module modules/mod_rewrite.so
위와 같은 방법으로 mod_rewrite를 활성화시켰다면, 아파치를 restart 해야 한다.
RewriteEngine On/Off 형태로 사용한다.
Rewrite 모듈을 설정파일의 해당 호스트 또는 섹션에서 활성화 여부를 설정하는 부분이다.
RewriteCond TestString Condition [Flags]
위와 같은 형태로 사용하며, RewriteRule을 적용시키기 위한 조건을 설정하는 부분이다.
'TestString'에 위치한 부분이 'Condition'과 일치한다면 RewriteRule 규칙을 적용시키게 된다.
RewriteRule Pattern Substitution [Flags]
위와 같은 형태로 사용되며, 실제 Rewrite, 즉, 리다이렉션을 적용시키기 위한 지시어다.
URL 리다이렉션 뿐만 아니라, file의 절대 경로로 바꿔주는 역할을 할 수도 있다.
'Pattern' 부분과 매칭되는 부분을 'Substitution' 형태로 수정한다는 의미이다.
# VirtualHost.conf 파일 설정
LoadModule rewrite_module modules/mod_rewrite.so
<VirtualHost *:80>
ServerName portpolio.co.kr
DocumentRoot /work/httpd/www/html
# Rewrite 지시어
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</VirtualHost>
'portpolio.co.kr'이라는 가상 호스트에 대해서 80포트로 들어오는 요청에 대해 Rewrite를 적용시킬건데, 만약 'portpolio.co.kr'에 대한 요청이 HTTPS off 되어 있다면(80포트로 들어오는 요청에 대해 적용시키는 것이니, 당연히 off), 'https://portpolio.co.kr'로 리다이렉션 하겠다는 의미이다.
%{HTTPS} : SSL 사용 여부를 의미하며, on/off 값으로 return 된다.
(.): 정규표현식(Regex)으로 나타낸 형태이다. '()' (소괄호 양옆)은 문자를 그룹화 시키고, '.'(마침표)는 문자 하나를 대체하며, '' (애스터리스크)는 이전에 대체된 것을 반복 또는 빈 문자열을 대체한다는 것을 의미한다.
즉, 위 예시에서 사용된 정규표현식을 해석하면 요청으로 들어온 URL의 '모든 문자영ㄹ'이라고 해석할 수 있다.
%{HTTP_HOST}: 호출된 서버의 domain을 의미하는데, 위 예시에서는 'portpolio.co.kr'에 해당한다. 이때 192.168.10.11:80 처럼 IP와 포트 형태로 브라우저에서 도메인이 넘어온 경우에는, 포트 번호까지 포함된다.
%{REQUEST_URI}: 도메인 이후의 리소스 절대 경로 및 파라미터를 나타낸다.
예를 들어 'portpolio.co.kr/myurl.html?var=value' 형태로 요청이 넘어왔다면, /myurl.html?var=value 부분이 이에 해당한다.
[R]: HTTP의 리다이렉트를 수행하는 Flag 이다. 이 플래그 다음으로 나오는 추가적인 RewriteRule이 있다면, Invalid URI 에러가 날 수 있으므로, 보통 [L] Flag와 함께 사용하게 된다.
[L]: 마지막 RewriteRule 임을 의미하는 Flag이다. 비슷한 기능으로 [END]도 있으나, 잘 사용하지는 않는다.
Character | Meaning | Example |
---|---|---|
. | 문자 하나를 대체 | c.t -> cat, cot, cut ... |
+ | 이전에 대체된 것을 반복 | a+ -> a, aa, aaa ... |
* | 이전에 대체된 것을 반복 또는 빈 문자열 대체 | a* -> a, aa ... |
? | 해당 문자가 있어도 되고, 없어도 된다는 의미 | colou?r -> color (u가 없어도 매칭됨), colour ... |
\ | 이스케이프 문자. 정규 표현식 문자를 표현하기 위해 사용 | \. -> .(마침표는 정규식 의미를 가지지 않는 단순 String) |
^ | 문자열의 첫 부분과 매칭됨. | ^a -> apple, anchor ... |
$ | 문자열의 끝부분과 매칭됨 | $m -> com, mom ... |
() | 문자를 그룹화 시킴. $1, $2, %1과 같이 그룹화된 부분을 변수처럼 반복적으로 사용할 수 있음 | (ab)+ -> ab, abab, ababab ... |
[] | 문자 클래스. 대괄호 안 문자 중에 하나를 매칭시킴 | c[uoa]t -> cut, cot, cat |
[^] | 문자 클래스의 반대. 대괄호 안에 포함되지 않는 문자를 매칭시킴 | c[^/]t -> cat, cut ... c/t는 안됨. |