.htaccess 예제

아래 .htaccess 파일 코드는 mvc 또는 clean url 등을 구현할 때 사용하는 간단한 예제이다.

Options -MultiViews

이 설정은 web server 인 Apache의 config 파일의 설정과 연관이 있다. Apache의 기본 설정이 어떻게 되어 있던 관계 없이 .htaccess 파일에 설정을 지정하면 .htaccess 파일이 존재하는 디렉토리(폴더)는 이 설정의 영항을 받는다.

Options -Multiview는 .htaccess 파일이 있는 디렉토리(폴더)에서 url이 /index 이고 / 디렉토리 안에 index.php 파일이 있을 때, index 디렉토리가 없을 경우 index.php 또는 index.html 또는 index.cgi 와 같은 파일을 찾아 실행하는 문제를 방지하기 위해 -를 이용하여 Multiview 옵션을 사용하지 못하도록 하기 위한 조치이다. 만약 이 옵션을 활성화하려면 Options +Multiviews라고 입력하면 된다.

apm_setup 5.x와 같이 php 예전 버전을 사용한 사람들이라면 .htaccess 파일을 전혀 사용하지 않고도 http://localhost/page 라고 하면 홈디렉토리의 root(주로 htdocs 폴더)에 page 폴더가 있지 않은 경우 page.php를 실행하는 것을 경험한 적이 있을 것이다. 실제로 국내 기능경기대회에 제출된 이전의 완성작들에는 위와 같은 Multiview 옵션의 활성화를 이용하여 구현한 사례도 적지 않았다.

그러나 최근의 프로그램이나 환경에서는 이 옵션을 사용하지 않도록 하는 것이 반드시 필요한 경우가 많다. 서버의 환경이 서로 다르고, mvc와 같은 코드는 http://localhost/controller/board/index 와 같은 url 구조를 활용하는 사례가 많기 때문이다.

RewriteEngine On

mod_rewriting을 활성화하여 myproject.com/controller/action/1/2/3 와 같은 주소가 가능하도록 한다.

mod_rewriting은 Apache의 추가적인 플러그인으로 사용자가 a.html을 접속하면 b.html로 연결되도록 강제로 설정한다든지 하는 방식으로 입력된 주소를 다른 주소로 다시 쓰는 기능을 갖는다. 따라서 mod_rewriting 플러그인은 주로 검색엔진 친화적인 URL(SEO 또는 Clean URL)을 구현하는데 사용된다.

이 플러그인을 사용하려면 서버에 mod_rewriting이 설치되어 있는지 확인해야 한다. 이 부분은 기회가 되면 나중에 설명하기로 하자.

Options -Indexes

디렉토리(폴더)의 파일 목록을 보는 것을 방지함. 이 값이 +Indexes로 되어 있다면, index.php나 index.html과 같이 Apache 서버가 디렉토리에 접근했을 때 기본적으로 찾아 실행할 파일이 없을 경우 해당 디렉토리의 폴더를 보여주게 되어 있다.

그런데 mvc 사이트를 운영하거나 보안 등을 고려할 때는 이 기능을 사용하지 않는 것이 좋다.

아래 그림은 Indexes 옵션이 활성화(+) 되어 있을 때 디렉토리에 접근했을 때의 모습니다. 파일과 폴더가 리스트로 표시되는 것을 볼 수 있다.

1

아래 그림은 Indexes 기능을 비활성화(-)시켰을 때 디렉토리에 접근했을 때의 모습이다.

2

이 옵션도 Apache의 config 설정에서 디렉토리에 대한 설정이며 + 또는 – 기호를 사용하여 활성화/비활성화를 정해준다.

# RewriteBase /home/

이 설정은 mod_write를 적용하는 기본 url을 정해주는 것이다. 이 예제에서는 줄 앞에 #이 붙어 있어 주석처리되었으므로 적용되지 않으므로 기본 url은 root 즉 / 가 된다. 만일 서브디렉토리를 rewrite 기본 url로 사용하기로 하였다면 위와 같이 해주어야 한다. root에서 실행된다면 쓰지 않거나 주석처리하면 된다.

RewriteCond %{REQUEST_FILENAME} !-d

입력된 url의 타겟이 실제 존재하는 디렉토리(폴더)가 아닌 경우에만 계혹 실행한다. 만일 실제 존재하는 디렉토리라면 이 예제의 다음을 실행하지 않고 해당 디렉토리에 접근하도록 한다는 것이다.

예를 들어 http://localhost/test 디렉토리가 실제 존재하면 그 디렉토리로 이동해서 설정에 따라 디렉토리 관련 작업을 수행한다. 그러나 test 디렉토리가 존재하지 않고, 이 예제의 다음 조건들을 모두 통과해서 마지막줄(RewriteRule ^(.+)$ index.php?url=$1 [QSA,L])을 만나게 되었다면 http://localhost/test는 http://localhost/index.php?url=test 와 같이 변환될 것이다.

RewriteCond %{REQUEST_FILENAME} !-f

입력된 url의 최종 경로가 파일이 아닌 경우에만 계속 실행한다. 즉, http://localhost/test/page.php라고 입력했을 때 실제 파일이 존재한다면 해당 파일을 실행한다. 이는 Clean URL를 적용하는 경우라도 실제 파일을 직접 여는 것을 허용하기 위한 것이다.

RewriteCond %{REQUEST_FILENAME} !-l

입력된 url의 최종 경로가 심볼릭 링크(symbolic link, 가상경로)가 아닌 경우에만 계속 실행한다. 이는 위 첫 번째 조건인 디렉토리에 대한 설정과 비슷하다. 심볼릭 링크란 가상디렉토리와 비슷한 개념으로 실제 http://localhost/images 라고 했을 때 root 아래에 images가 없지만 다른 곳에 위치한 특정 디렉토리를 마치 현재 디렉토리의 images 디렉토리인 것처럼 처리해주는 것을 말한다. 역시 이 설정은 심볼릭 링크에 접근하면 해당 디렉토리에 접근하여 설정에 맞게 처리하도록 하라는 것이다.

RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]

이 예제의 모든 코드는 모두 이 한 줄 때문에 쓰여진 것이다.

즉, 웹사이트의 url root(http://localhost/) 끝에 어떤 문자열이 입력되어도 이를 실제 사이트에 존재하는 파일이나 디렉토리 또는 심볼릭 링크가 아닌 이상 입력되는 모든 문자열을 index.php에 url 파라미터의 값으로 대입하여 링크를 만들고 이 주소 이동 처리한다. 즉 브라우저의 주소 창에는 http://localhost/controller/archive/123이라고 입력했지만 실제 내부적으로는 http://localhost/?index.php?url=controller/archive/123 이라고 입력되어 처리되는 것을 말한다.

^(.+)$ : 주소 끝에 입력되는 모든 문자열을 받아낸다. 이 문자열들은 뒤의 $1로 캐치한다.

QSA flag : index/board?mode=list와 같은 입력을 index.php?url=board&mode=list와 같이 처리해준

L flag : rewrite rule이 끝남을 표시해준다.

 

 

Share the joy
  •  
  •  
  •  
  •  

One thought on “.htaccess 예제

댓글 남기기