본문 바로가기

IT/MW

[Apache] http -> https redirect (mod_write, redirect)

1. HTTP -> HTTPS Redirect

SSL인증서를 설치하여 https를 활성화 해도, 일부 사용자는 계속해서 http포트로 연결을 시도하려고 한다.

http포트를 막는 것도 하나의 방법이 될 수는 있지만, 일일이 다 안내를 해주는 것은 굉장히 귀찮은 일이 될 수 있다.

따라서, http포트로 접속하는 사용자들을 강제로 https로 접속하게 만들어 주는 것이 해결책이 될 수 있다.

2. Rewrite / Redirect

SSL 인증서 설치까지는 완료되어, https가 활성화 되었다는 가정하에 진행해보자.

방법은 두 가지가 있다.

1) Rewrite

들어온 url을 rewrite하여 새로운 url을 호출하게 된다.

rewrite 기능을 사용하기 위해서는 mod_rewrite module이 필요하다.

 

httpd.conf

Include ${APACHE_HOME}/conf/extra/httpd-vhosts.conf
LoadModule rewrite_module modules/mod_rewrite.so

httpd-vhosts.conf

<VirtualHost *:80> 

DocumentRoot "/www/example" 
ServerName www.example.com 

RewriteEngine On 
RewriteCond %{HTTPS} !on 
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R,L] 

</VirtualHost>

RewriteEngine : 엔진 사용 여부를 정한다. Default는 Off로 되어 있기 때문에, 사용하기 위해선 On으로 변경이 필요하다.

RewriteCond : 조건문을 설정한다. 위 예시의 경우, HTTPS가 아닌 경우를 뜻한다.

RewriteRule : 조건에 따른 규칙을 설정하고 규칙에 따른 동작을 지정한다. RewriteRule 의 사용 범위는 httpd.conf 에 사용하면 전역적으로 반영되며 <VirtualHost>나 <Directory>, <Location> 에 사용할 경우 해당 범위에만 효과를 미친다.

httpd.apache.org/docs/2.4/ko/mod/mod_rewrite.html

2) Redirect

들어온 요청을 redirect 하여 다른 url로 보낸다.

 

httpd.conf

Include ${APACHE_HOME}/conf/extra/httpd-vhosts.conf

httpd-vhosts.conf

<VirtualHost *:80> 
   ServerName www.example.com  
   Redirect permanent / https://www.example.co.kr/
</VirtualHost>

앞에서 설명한 설정 지시어들은 아파치가 파일시스템의 특정 장소에 있는 내용을 클라이언트에게 보내게 만든다. 그러나 때때로 요청한 내용이 다른 URL에 있다고 클라이언트에게 알려주어, 클라이언트가 새로 그 URL을 요청하도록 만드는 것이 좋을 때가 있다. 이를 리다이렉션(redirection)이라고 하며, Redirect 지시어를 사용한다.

예를 들어, DocumentRoot 아래 /foo/ 디렉토리의 내용을 새로 /bar/ 디렉토리로 옮겼다면 다음과 같이 클라이언트가 새로운 위치를 요청하도록 한다:

Redirect permanent /foo/ http://www.example.com/bar/

그러면 www.example.com 서버의 /foo/로 시작하는 URL-경로는 /foo/를 /bar/로 바꾼 URL로 리다이렉션된다. 클라이언트를 원래 서버외에 어떤 다른 서버로도 리다이렉션할 수 있다.

 

또, 아파치는 더 복잡한 재작성 문제를 위해 RedirectMatch 지시어를 제공한다. 예를 들어, 다른 요청은 그대로 두고 사이트 홈페이지에 대한 요청만을 다른 사이트로 리다이렉션하려면:

RedirectMatch permanent ^/$ http://www.example.com/startpage.html

임시로 사이트의 모든 페이지를 다른 사이트의 특정 페이지로 리다이렉션하려면:

RedirectMatch temp .* http://othersite.example.com/startpage.html

3. 결론

Rewirte, Rediret 모두 사용 가능하다. 상황에 따라 원하는 방식으로 설정을 진행하면 된다.

mod_rewrite의 경우, 조건에 따라 설정할 수 있는 방법이 상당히 많고 redirect에 비해 복잡하다. 

강력한 규칙이 필요한 경우 mod_rewrite, 단순한 리다이렉션 기능이 필요한 경우 redirect를 쓰는 것이 좋을 듯 하다.

 

httpd.apache.org/docs/current/rewrite/avoid.html#redirect

'IT > MW' 카테고리의 다른 글

[Apache/Tomcat] mod_jk vs mod_proxy  (0) 2021.04.05
[Tomcat] "/", "\" URI에서 사용  (0) 2021.03.26
[WAS][troubleshooting] Unsupported major.minor version  (0) 2021.03.03
[Apache] Log  (0) 2020.09.21
08. Application Server, Servlet Container  (0) 2020.06.16