아파치 rewrite 설정
Apache에서 사용된는 rewrite 모듈 설정 방법에 대해 설명드립니다. 주요 옵션인 RewriteRule에서 사용되는 정규식과 RewriteCond 조건 사용방법 변수등에 rewrite 예제에 대해서 설명드리겠습니다.

rewrite 모듈의 사용 사례
환경에 따라 다양한 목적으로 아피치 mod_rewrite 를 사용할 수 있습니다. 몇 가지 주요 사용 사례은 아래와 같습니다.
- URL 주소 수정 : 기존의 /display_article.php?articleId=my-article 형태의 복잡한 주소를 /articles/my-article/ 형태로 간단하게 수정할 수 있습니다.
- 외부 링크 차단 : 이미지 주소 등이 외부 페이지에서 링크 될 경우 서버의 트래픽이 부족할 수 있습니다. Referer 주소를 확인하여 트래픽을 차단 할 수 있는데, 이 경우에도 mod_rewrite 모듈이 사용될 수 있습니다.
- 주소 Redirect : 페이지가 삭제되거나, 이동되는 경우 기존의 URL으로 접속 이 가능하도록 Redirect 할 수 있습니다.
이외에도 404 페이지에 대한 처리에도 사용될 수 있을 뿐더러, 웹 서버의 파일 확장자를 숨기는 등에도 사용될 수 있습니다.
Apache rewrite 모듈 활성화
아파치 웹 서버에서 mod_rewrite 모듈을 사용하기 위해서는 먼저, 아래의 명령어로 모듈을 활성화 해야 합니다. 리눅스 서버일 경우, 다음 명령어로 모듈을 활성화 하고 Apache 웹 서버를 재실행 할 수 있습니다.
$ sudo a2enmod rewrite
$ sudo systemctl restart apache2

Apache 설정 환경
rewrite 규칙을 설정하는 파일은 아파치 설정파일과 VirtualHost 에서도 설정할 수 있습니다. 하지만 이글에서는 .htaccess 파일에서 설정하도록 하겠습니다.
다음과 같이 VirtualHost 설정에서 AllowOverride 옵션이 활성화 되게 되면 DocumentRoot 디렉터리의 .htaccess 파일을 통해서 rewrite 규칙을 정의 할 수 있습니다.
<VirtualHost *:80>
#ServerName hiseon.me
ServerAdmin webmaster@hiseon.me
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory /var/www/html/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
아파치 rewrite 설정
.htaccess 파일의 주석은 아파치 설저 파일과 동일하게 ‘#’ 문자로 시작하게 됩니다. rewrite 설정에 사용되는 주요 지시어는 아래와 같습니다.
- RewriteEngine : Rewrite Engine을 활성화 여부를 설정합니다. 설정 값으로는 on 값과 off 값이 있습니다.
- RewriteRule : Rewrite 규칙을 정의합니다.
- RewriteCond : RewriteRule 에 적용될 조건을 정의합니다.
RewriteRule 은 다음과 같은 문법을 갖습니다.
RewriteRule Pattern Substitution [Flags]
정규 표현식으로 URL 패턴을 정의하고, 해당 URL 패턴이 어떻게 치환 될 것인지 정의합니다. 그리고 마지막에 대한 동작에 대한 옵션 플래그를 지정합니다.
그리고 RewriteCond 지시어는 다음과 같은 문법을 같습니다. 입력된 문자열로부터 조건을 확인하게 됩니다.
RewriteCond TestString Condition [Flags]
예제를 통해서 rewrite 모듈 사용법에 대해서 설명드리도록 하겠습니다.
URL 재정의 예제
가장 먼저, URL주소가 수정이 되어 새로운 주소로 이동하는 예제에 대해서 설명드리도록 하겠습니다. 아래의 내용을 .htaccess 설정 파일에 추가합니다.
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^old-url.html$ /new-url.html [R=301,L]
</IfModule>
먼저 mod_rewrite 정의되었을 경우만 Rewrite 설정이 적용될 수 있도록 아래의 조건 구문이 사용되었습니다.
<IfModule mod_rewrite.c>
</IfModule>
RewriteRule 에서 사용되는 패턴과 치환 문자 그리고 플래그를 설명드리면 다음과 같습니다.
- ^old-url.html$ : 패턴이 정규 표현식으로 URL 주소가 시작(^)을 old-url.html으로 하고 끝나는($) 주소일 경우입니다.
- /new-url.html : 도메인을 제거하여 /new-url.html 으로 치환되게 됩니다.
- [R=301,L] : 새로운 주소로 치환하면서 리다이렉트(R)를 301 값으로 하면서 더이상 RewriteRule 을 적용하지 않는 마지막 규칙(L)이라는 것을 나타냅니다.
이미지 외부 링크 차단 예제
아래는 이미지가 외부 페이지에 링크되었을 경우 접속을 차단 하는 예제입니다.
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www.)?hiseon.me/.*$ [NC]
RewriteRule .+.(gif|jpg|png)$ - [F]
</IfModule>
조건을 확인하기 위해서 RewriteCond 지시어와 해당 조건이 일치되었을 경우 수행되는 RewriteRule 규칙이 정의되었습니다.
- RewriteCond %{HTTP_REFERER} !^$
HTTP 헤더에 Referer 주소가 정의되었을 경우입니다. - RewriteCond %{HTTP_REFERER} !^http://(www.)?hiseon.me/.*$ [NC]
Referer 주소가 대소문자가 구분([NC]) 하지 않고 www.hiseon.me 또는 hiseon.me 되어야 하는 경우입니다. - RewriteRule .+.(gif|jpg|png)$ – [F]
조건이 일치되면 수행되는 규칙입니다. 파일 확장자가 gif, jpg, png 일 경우 치환하지 않고 Fobidden 에러([F]) 가 발생하도록 정의합니다.
rewrite 모듈에 대한 보다 자세한 내용은 아래의 페이지를 참고해 주시기 바랍니다.
https://httpd.apache.org/docs/current/rewrite/intro.html
( 본문 인용시 출처를 밝혀 주시면 감사하겠습니다.)