블로그 프로필 이미지




☞ CI 에서 index.php 죽이기란?


 사실 index.php 를 죽인다는 말은 rewrite 모듈을 접해보지 않은 사람이라면 이해가 안갈 수 있다. 나도 처음 날코딩을 하다가 코드이그나이터를 접했을 때, 이 말을 알게 되었다. 그때 당시 index.php 죽이기라는 말을 이해하는것 보다는 공유되어있는 파일을 그냥 가져다가 썻던걸로 기억한다. 


 본론으로 들어가서 index.php 죽이기 라는 말은 코드이그나이터의 규칙을 생각하면서 보면 이해하기 쉽다. 일반적으로 코드이그나이터의 URL 형식은 아래와 같다.


http://호스트주소/index.php/컨트롤러/함수/파라미터


 위와 같이 코드이그나이터에서는 기본적으로 index.php 를 거쳐야만 application 과 system 파일들을 로드하여 CI의 라이브러리나 각종 함수들을 이용 할 수 있다. 이말은 즉 자신의 index.php 파일을 보면 몇가지 설정해주어야 하는게 있는데, 그중에 하나가 application 디렉토리 경로와 system 디렉토리 경로다. 이경로가 잘못될시 코드이그나이터는 작동이 안된다. 그렇기 때문에 URL 접근시 index.php 를 거쳐야한다.


 위의 말을 이해했다면 index.php 죽이기라는 말도 이해가 될것이다. 다시말해 index.php 죽이기는 URL 접속시 index.php 가 없는 형태로 사용 한다는 말이다. 물론 URL 에 index.php 를 붙인 형태로도 사용할 수 있다. index.php 죽이기를 하면  URL 경로를 아래와 같은 형태로 사용할 수 있다.


http://호스트주소/컨트롤러/함수/파라미터




☞ CI 에서index.php 죽이기와 .htaccess 파일


CI 에서 URL 접속시 index.php 없이 사용하기 위해선 rewrite 모듈을 이용하여야 한다. rewrite 같은 경우 Apache 모듈중 하나인 mod_rewrite 모듈을 로드해 주어야 한다. 기본적으로 로드가 되어있을것이다. 만약 Apache httpd.conf 환경설정파일에서 mod_rewrite 모듈이 아래과 같이 '#' 으로 주석처리 되어있다면 주석처리된 '#' 을 없애주면 된다.


#LoadModule rewrite_module modules/mod_rewrite.so

 

 이제 .htaccess 파일에 대해 알아보기전에 Apache 의 httpd.conf 환경설정 파일에서 한가지 더 설정해 주어야 하는게 있다. 일단 환경설정 파일에서 아래와 같은 구문을 찾아 화살표로 된 부분의 구문으로 변경해주어야한다. 


찾을 구문 => AllowOverride None

변경할 구문 => AllowOverride All


 위의 설정과 같이 변경해 주는 이유는 앞으로 설명할 .htaccess 파일을 사용하기 위해서이다. 위와 같이 설정이 되어있지 않다면, index.php 죽이기를 할 수 없다. 그이유는 Apache 에서는 접근을 제한할 수 있는 파일이 있는데 이는 기본적으로 .htaccess 의 확장자를 가진 파일이다. 이설정을 위와같이 All 로 변경해주면 .htaccess 파일을 통해 디렉토리 접근을 개별로 설정할 수 있게된다. 물론 .htaccess 파일확장자가 아닌 다른 이름의 확장자파일을 사용할 수 있다. 만약 .htaccess 확장자를 가진 파일이 아닌 다른 확장자를 가진 파일을 원한다면 아래와 같은 구문을 추가해 주면된다.


AccessFileName .파일확장자명


 참고로 .htaccess 파일은 리눅스에서 숨김파일이기 때문에 vi 명령어를 통하여 만들 수 있지만, 윈도우에서는 확장명만 가진 파일을 만들 수 없다. 만약 윈도우에서 서버를 운영한다면 CI 를 다운받아서 그안에 있는 .htaccess 파일을 사용해야한다.


 위와 같이 Apache 설정을 다 끝냈다면, 지금부터 .htaccess 파일을 설정 해주어야한다. .htaccess 설정 같은 경우, Rewrite 구문과 정규식을 이용하여 작성하게 되는데 실무자들도 항상 헷갈리는 부분이다. 참고로 나도 기본적인 방식만 이해하며 쓰고 있기때문에, 구문에 대한 자세한 설명은 하지 않겠다. 먼저 index.php 를 죽이기 위해서 사용되는 Rewrite 설정은 아래와 같다.


<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond $1 !^(index\.php|robots\.txt) RewriteRule ^(.*)$ index.php?/$1 [L] </IfModule>


 위의 설정을 그대로 써도 되지만, 공개적인 디렉토리를 접근할 시 몇가지 추가해주어야 하는 부분이 있다. 그 이유는 아래와 같이 public 디렉토리에 Images, CSS, Javascript, Font 등의 파일들이 있을 시 URL 을 통해 접근해야되는 경우다.


+ www

  + application

  + system

  - public

    - Images

    - CSS

    - Javascript

    - Font


 위와 같은 상황일 경우 설정해 주어야 하는 부분은 Rewrite 설정구문 중에 RewriteCond 에 설정되어있는 정규식 구문 이다. 설정하는 방법에 대한 예제는 아래와 같다. 아래의 예제는 위의 설정처럼 URL 을 통해 접근해야할 디렉토리가 public 일경우이다.


 RewriteCond $1 !^(index\.php|robots\.txt|public)

 

 설정하는 방법은 위와같이 상위 디렉토리인 public 이라는 디렉토리명만 추가해주면된다. 추가실시 한가지 명심해야할 부분은 디렉토리명 또는 파일명을 추가할 시 OR 연산자인 '|' 을 먼저 써준다음 추가해 주어야 한다는 것이다.


 한가지 중요한점이 더 있다면, .htaccess 파일은 외부 URL 접근이 허용되지 않게 하는것이다. 이 설정은 기본적으로 Apache 의 httpd.conf 파일을 통해 설정할 수 있다. 대부분 Apache 를 설치시 기본적으로  .ht 로 시작되는 파일확장자명은 접근거부로 설정되어 있기때문에, 따로 설정할 필요는 없겠지만, 만약 URL 을 통해 .htaccess 파일이 접근이 된다면 아래와 같이 해주어야 한다.


<Files ".ht*">
Require all denied
</Files>


 이것으로 index.php 죽이는 방법에 대한 설명을 끝내도록 하겠다. 아래는 기본설정된 .htaccess 파일과 참고 싸이트이다. 


 .htaccess 파일 다운로드


htaccess.zip




댓글
요요 2016.12.29 10:03 신고  Edit  Rep

한번 올려보아요
안녕하세요

반갑습니다

(비회원은 자신의 글을 볼 수 없습니다.)