이번 포스팅에서는 아파치의 Rewrite 모듈을 사용하여 페이지 리다이렉션 하는 방법에 대해 알아보도록 하자!
1. mod_rewrite 활성화
아파치는 서버 역할을 할 수 있는 최소한의 코어 만으로 이루어져 있고, 추가적인 기능을 사용할 때에는 모듈을 활성화시켜야 한다. 이번에 우리는 rewrite 모듈을 사용할 것이므로, 우선 rewrite 모듈을 활성화하는 방법부터 살펴보자!
다음 두가지 방법 중 하나를 선택해서 적용하면 된다.
① 설정하려는 httpd.conf 파일(vhost.conf나 ssl.conf 처럼 다를 수 있음.)에 직접 추가
# httpd.conf 파일 수정
# conf 파일 맨 상단에 아래 문구 추가
LoadModule rewrite_module modules/mod_rewrite.so
② {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 규칙을 적용시키게 된다.
사용 예시는 아래 3번에서 살펴보기로 하자!
2-3) RewriteRule
RewriteRule Pattern Substitution [Flags]
위와 같은 형태로 사용되며, 실제 Rewrite, 즉, 리다이렉션을 적용시키기 위한 지시어다. URL 리다이렉션 뿐만 아니라,
file의 절대 경로로 바꿔주는 역할을 할 수도 있다.
'Pattern' 부분과 매칭되는 부분을 'Substitution' 형태로 수정한다는 의미이다.
이에 대한 사용 예시도 아래 3번에서 살펴보기로 하자!
3. Rewrite 전체 사용 예시
예시로는 HTTP로 들어온 요청을 자동으로 HTTPS 로 리다이렉션 시켜주는 방법에 대해 살펴보자!
참고로 아래 예시에서는 가상 호스트 설정을 하고, 이 서버에 대한 이름은 co-no.intranet.co.kr 로 가정한다.
또한 DocumentRoot는 /deployment/INTRANET 으로 설정하여, 이 포스팅에서 언급하는 Rewrite 설정과는 연관이 없으므로, 그냥 그러려니 하고 넘어가도 된다.
# VirtualHost.conf 파일 설정
LoadModule rewrite_module modules/mod_rewrite.so
<VirtualHost *:80>
ServerName co-no.intranet.co.kr
DocumentRoot /deployment/INTRANET
# Rewrite 지시어
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</VirtualHost>
위 구문을 간단히 해석하자면, 'co-no.intranet.co.kr' 이라는 가상 호스트에 대해서 80포트로 들어오는 요청에 대해 Rewrite를 적용시킬건데, 만약 co-no.intranet.co.kr 에 대한 요청이 HTTPS off 되어 있다면(80포트로 들어오는 요청에 대해 적용시키는 것이니, 당연히 off 되어 있겠지?), https://co-no.intranet.co.kr 로 리다이렉션 하겠다는 의미이다.
- %{HTTPS} : SSL 사용 여부를 의미하며, on/off 값으로 return 된다.
- (.*) : 정규표현식(Regex) 으로 나타낸 형태이다. '()' (소괄호 양옆) 은 문자를 그룹화 시키고, '.' (마침표) 는 문자 하나를 대체하며, '*' (애스터리스크) 는 이전에 대체된 것을 반복 또는 빈 문자열을 대체한다는 것을 의미한다.
즉, 위 예시에서 사용도니 정규표현식을 해석하면 요청으로 들어온 URL의 '모든 문자열' 이라고 해석할 수 있다. - %{HTTP_HOST} : 호출된 서버의 domain을 의미하는데, 위 예시에서는 'co-no.intranet.co.kr' 에 해당한다. 이때 170.20.30.40:80 처럼 IP와 포트 형태로 브라우저에서 도메인이 넘어온 경우에는, 포트 번호까지 포함된다.
- %{REQUEST_URI} : 도메인 이후의 리소스 절대 경로 및 파라미터를 나타낸다.
예를 들어 'co-no.intranet.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, etc. |
+ | 이전에 대체된 것을 반복 | a+ => a, aa, aaa, etc. |
* | 이전에 대체된 것을 반복 또는 빈 문자열 대체 |
a* => , a, aa, etc. |
? | 해당 문자가 있어도 되고, 없어도 된다는 의미 | colou?r => color (u가 없어도 매칭됨), colour, etc. |
\ | 이스케이프 문자. 정규 표현식 문자를 표현하기 위해 사용 |
\. => . (위에서의 마침표는 정규식 의미를 가지지 않는 단순 string) |
^ | 앵커. 문자열의 첫 부분과 매칭됨. |
^a => apple, anchor, etc. |
$ | 다른 종류의 앵커. 문자열의 끝부분과 매칭됨. |
$m => com, mom, etc. |
() | 문자를 그룹화 시킴. $1, $2, %1 과 같이 그룹화된 부분을 변수처럼 반복적으로 사용할 수 있음. |
(ab)+ => ab, abab, ababab, etc. |
[] | 문자 클래스. 대괄호 안 문자 중에 하나를 매칭시킴 |
c[uoa]t => cut, cot, cat |
[^] | 문자 클래스의 반대. 대괄호 안에 포함되지 않는 문자를 매칭시킴 |
c[^/]t => cat, cut, etc. c/t 는 안됨. |
◈ 정규식을 통한 역참조 흐름
※ RewriteRule의 다양한 플래그 참조
https://runebook.dev/ko/docs/apache_http_server/rewrite/flags
참고
https://snoop-study.tistory.com/10
https://hiseon.me/server/apache-rewrite-examples/
'Middleware > 웹서버' 카테고리의 다른 글
[httpd] RedHat JBCS httpd 에서 Apache httpd로 이전하기 (1) (0) | 2024.04.07 |
---|---|
[httpd] Apache httpd의 로그 삭제 스크립트 및 crontab 등록하여 로그 파일 삭제 자동화하기 (0) | 2023.11.22 |
[Nginx] http → https 리다이렉션 및 SSL 인증서 적용 (Nginx ver.1.20.1 기준) (1) | 2023.11.03 |
[IIS] IIS(웹서버) 구축_Windows Server 2019 환경 (0) | 2022.07.22 |
[httpd] Apache httpd Virtualhost 설정 - 한 서버에서 여러 웹사이트 서비스하기 (0) | 2022.06.10 |
최근댓글