[Apache] Rewrite 모듈 설정 - 페이지 리다이렉션 하기

배세훈·2022년 10월 21일
0

webserver

목록 보기
1/2

1. mod_rewrite 활성화

  • 아파치는 서버 역할을 할 수 있는 최소한의 코어 만으로 이루어져 있고, 추가적인 기능을 사용할 때에는 모듈을 활성화시켜야 한다.

1-1) 설정하려는 httpd.conf 파일에 직접 추가

# httpd.conf 파일 수정

# conf 파일 맨 상단에 아래 문구 추가
LoadModule rewrite_module modules/mod_rewrite.so

1-2) {apache_home}/conf.modules.d/00-base.conf 파일 수정

nano 또는 vi 명령어로 00-base.conf 파일을 연 후, 아래 문구를 추가하거나 주석 처리 된 것을 해제한다.

# 00-base.conf 파일 수정
LoadModule rewrite_module modules/mod_rewrite.so

위와 같은 방법으로 mod_rewrite를 활성화시켰다면, 아파치를 restart 해야 한다.

2. httpd.conf 파일에 rewrite 관련 지시어 추가

2-1) RewriteEngine

RewriteEngine On/Off 형태로 사용한다.
Rewrite 모듈을 설정파일의 해당 호스트 또는 섹션에서 활성화 여부를 설정하는 부분이다.

2-2) RewriteCond

RewriteCond TestString Condition [Flags]

위와 같은 형태로 사용하며, RewriteRule을 적용시키기 위한 조건을 설정하는 부분이다.
'TestString'에 위치한 부분이 'Condition'과 일치한다면 RewriteRule 규칙을 적용시키게 된다.

2-3) RewriteRule

RewriteRule Pattern Substitution [Flags]

위와 같은 형태로 사용되며, 실제 Rewrite, 즉, 리다이렉션을 적용시키기 위한 지시어다.
URL 리다이렉션 뿐만 아니라, file의 절대 경로로 바꿔주는 역할을 할 수도 있다.
'Pattern' 부분과 매칭되는 부분을 'Substitution' 형태로 수정한다는 의미이다.

3. Rewrite 전체 사용 예시

  • 예시로는 HTTP로 들어온 요청을 자동으로 HTTPS로 리다이렉션 시켜주는 방법
  • 참고로 아래 예시에는 가상 호스트 설정을 하고, 이 서버에 대한 이름은 portpolio.co.kr로 가정한다.
# 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는 안됨.
profile
성장형 인간

0개의 댓글