강좌게시판

제목 index.php 죽이기!!
글쓴이 변종원(웅파) 작성시각 2011/11/07 22:02:13
댓글 : 26 추천 : 4 스크랩 : 2 조회수 : 163188   RSS
많은 분들이 codeigniter 도입 초반부에 index.php 없이 쓰려다 암초에 걸려서
포기하거나 스트레스를 받거나 하실 겁니다.
(사실 저도 가끔 다른 환경에 설치하다보면 안될 때가 있습니다.)

그래서 여태까지 경험으로 축적했던 내용들을 풀어볼까 합니다.

http://codeigniter-kr.org/index.php/lecture/lists

http://codeigniter-kr.org/lecture/lists 

어느 것이 더 직관적일까요? 그리고 사용자입장에서 메인을 거치지 않고 다이렉트로 특정위치에
접근하고 싶을때 index.php라는 9자를 더 치느냐 치지 않느냐는 엄청난 차이입니다.
주소 치고 1-2초안에 사이트 안 뜨면 꺼버리는 우리 나라 사용자 환경에서는 9자 안 치는 것도
큰 메리트입니다. 

실무로 들어가 보면 index.php를 주소에서 없애기 위해서는 apache 의 모듈중 하나인 mod_rewrite를 이용해야 합니다.
(mod_rewrite에 대한 자세한 것은 검색을 통해 찾아보세요. 정규식 머리 아픕니다. ^^;)


1. apache conf인 httpd.conf 파일에서 mod_rewrite 로 검색을 하면 통상적으로
#LoadModule rewrite_module modules/mod_rewrite.so
라는 라인이 나옵니다. 주석처리가 되어 있을 수 있구요. 일단 주석처리가 되어 있다면 주석(#)을 제거하시구요.
위 라인이 없다면 mod_rewrite 모듈을 설치하셔야 하는데 (요즘 apm 셋팅에는 거의 포함되어 있습니다.)
설치법도 검색으로... ^^; codeigniter에서의 사용법이 주 인지라...

그리고 또 한가지 대부분의 분들이 놓쳐서 헤매는 부분인데 .htaccess 파일을 사용하려면 서버 디렉토리의
AllowOverride 옵션을 All로 설정을 하셔야 합니다. 기본값은 None입니다. 
이 셋팅을 바꾸지 않으면 죽어도 index.php 를 없앨 수 없습니다.
AllowOverride None -> AllowOverride All
설정을 저장하고 아파치 서버를 재시작 합니다.
이제 mod_rewirte 모듈을 이용하여 .htaccess 파일을 쓸 수 있게 되었습니다.


2. config.php 파일을 설정할 차례입니다. (http://www.codeigniter-kr.org/lecture/view/197/page/1 참고)
//$config['index_page'] = 'index.php';
$config['index_page'] = '';
설정파일의 두번째 항목에서 index.php라는 값을 제거하시면 됩니다.


3. 이제 .htaccess 파일을 설정할 차례입니다.
많은 분들이 시행착오를 겪고 있기에 정형화된 파일을 어느 누군가가 만들어서 배포했고 우리들은 쭉 사용하고 있습니다.
이 파일은 index.php와 동일한 디렉토리에 위치하면 됩니다.
<IfModule mod_rewrite.c>
    RewriteEngine On
 RewriteBase /
 RewriteCond $1 !^(index\.php|images|captcha|data|include|uploads|robots\.txt)
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteRule ^(.*)$ /index.php/$1 [L]
</IfModule>
.htaccess라고 파일을 만들고 위 내용을 복사해넣습니다. 저장후 파일의 퍼미션을 누구나 실행하고 읽을수있도록 주시면 됩니다. chmod 755 .htaccess (윈도우는 퍼미션 필요없습니다.)

위 내용을 주요부분만 설명하면  4번째 줄은 가변적으로 사용되는 줄이라 설명을 하겠습니다.
RewriteCond $1 !^(index\.php|images|captcha|data|include|uploads|robots\.txt)

index.php 파일이 있는 하위 디렉토리중 images, captcha, data, include, uploads 디렉토리와 index.php파일 자체, robots.txt 파일에는 index.php 를 없애는 정규식을 적용하지 않겠다는 말입니다.
무슨 말이냐 하면 위 라인이 없다면 http://codeigniter-kr.org/images/logo_ci1.png 라고 접근하면 에러가 뜹니다.
위 .htaccess 파일은 주소에서 무조건 index.php 파일을 제거하는 것인데 
 http://codeigniter-kr.org/images/logo_ci1.png 라고 치면  
http://codeigniter-kr.org/index.php/images/logo_ci1.png 이렇게 인식을 하게 됩니다. 당연히 에러가 나겠죠.

다시 말하면 .htaccess는 주소에 index.php가 무조건 있다고 가정한 상태에서 그걸 제거해주는 겁니다.
그래서 그 룰을 적용하지 않고 싶을때 위의 한줄에 기술을 해주는 겁니다.

저렇게 해줘야  http://codeigniter-kr.org/images/logo_ci1.png 라고 쳤을때 이상없이 접속이 되고 
그 이외의 디렉토리나 파일에는 index.php 없애기가 적용이 되는 겁니다.

설명이 길어졌지만 꺼꾸로 이렇게 이해하시면 됩니다.
"내가 index.php 하위에 디렉토리를 하나 만들고 이미지나 js파일을 넣고 싶다."
그러면 그 만든 디렉토리를 저 라인안에 삽입을 해줘야 합니다. 

만약 js 라는 디렉토리를 만들고 그 안에 자바스크립트 파일을 넣는다고 하면
RewriteCond $1 !^(index\.php|images|captcha|data|include|uploads|js|robots\.txt)
이렇게 js라고 넣어줘야 에러 없이 접근을 할수가 있습니다.



자. index.php 없애기 끝났습니다. 
참. 쉽죠잉? (안 쉬운가요?)

알고나면 쉬운 것이 되는 것이고 모를 때는 어렵고 답답한 것이겠죠.


그리고 시간 나실때 mod_rewrite도 검색해서 공부해두시면 좋습니다.


제가 포럼 강좌게시판에 올리는 내용은 강의교재나 책으로 활용될 소재들이기 때문에
무단전제는 금합니다. 퍼가실 때는 링크로 퍼가시기를 부탁 드리겠습니다. 

태그 참 쉽죠잉?,mod_rewrite,index.php,htaccess
 다음글 개별 개발환경 셋팅하기 (4)
 이전글 설정 - config.php 2편(마무리) (8)

댓글

인스카 / 2011/11/07 22:59:31 / 추천 0
index.php 죽이기 종결자군요 ㅎㅎㅎ
한대승(불의회상) / 2011/11/08 10:36:40 / 추천 0
좋은 정보 감사 합니다. ^^

부가적으로 설명 드리자면...

 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-d
이부분은 파일이나 디렉토리가 존재하면 index.php를 거치지 않고 직접 아파치가 처리 하라는 뜻입니다.



무명의시인2 / 2011/11/09 11:51:19 / 추천 0
너무너무 좋습니다 ㅎㅎㅎㅎ
송군 / 2011/11/12 21:22:03 / 추천 0

좋은 글 감사합니다

아시나요 / 2012/01/04 14:12:00 / 추천 0

정리 잘 해주셨네요. 감사합니다.

타로 / 2012/01/09 11:51:25 / 추천 0
아래는 제가사용한 예입니다. 직접호출할 폴더의 구조상 폴더명으로 처리해주는 대신 확장자별로 처리하게 바꾸어 사용중입니다.

RewriteEngine On

RewriteRule !\.(gif|jpe?g|png|swf|css|js|htm|html|flv|cab|xml)|var(.+)storage.pdf(.+)\.pdf$ index.php

DirectoryIndex index.php
이런 방법도있으니 참고하세요. ^^
변종원(웅파) / 2012/01/09 12:17:21 / 추천 0
 타로/ 확장자로 처리하는 것도 방법이네요. 다만 디렉토리 체크 방식과 확장자 방식에서 rewrite모듈의 사용빈도(=cpu사용률)를 생각해봐야할 것 같네요.
엑세스가 많은 곳에서는 확장자별로 체크하다보면 서버 cpu사용률이 조금 더 올라갈 것 같습니다. 

추가 - 다시 생각해보니 엑세스 횟수는 동일하네요. ^^
타로 / 2012/01/09 13:34:37 / 추천 0
웅파/ 덧글로 이야기할 것은 못되지만 여담으로 봐 주세요!! ^^

CodeIgniter 소스를 조금 분석해 보았는데, MVC환경에서 저는 module 구조를 선호합니다.

module / foo + foo.controller.php
             + foo.model.php
             + foo.view.php
             + foo.helper.php
             + foo.hook.php
module 폴더안에 각 기능별 폴더를 만들고 그 안에 모든 파일을 관리하는 방식입니다. CodeIgniter는 application 폴더에 각 MVC모델별로 폴더안에 파일을 저장하는 방식이더군요. 제가 예시한 구조는 가독성과 관리에 중점을 둔 방식이며 제가 개인적으로 선호하는 방식이기도 합니다.

현재 CodeIgniter의 환경기능으로는 이런 구조를 구현하기가 어렵더군요. core를 수정해야 가능한 구조이기에.. 웅파님께서 보셨을 때 제가 사용하는 구조와  CodeIgniter 구조간의 문제점이 있을까요?

사실  CodeIgniter core파일을 이미 수정하고 있었습니다. 조언부탁드리겠습니다. - 늘 행복하세요.
변종원(웅파) / 2012/01/09 14:05:47 / 추천 0
 타로/ 이론적으로는 어떤지 모르겠지만 실무에서는 불편한 것이 사실입니다.
타로님처럼 사용할 수는 있으나 core를 수정하거나 matchbox같은 라이브러리를 사용할 수 있습니다.
matchbox는 ci에서 모듈 구조를 가능하게 해주는 것인데 이 녀석도 디렉토리가 따로 나눠져 있기는 합니다.
modules/aaaa/controllers, models, views
코어를 수정하시기 보다는 matchbox를 수정하여 쓰시는 것이 좋을 것 같네요. (디렉토리 부분만
변경하시면 되니까요)

이론에서는 꼭 나눠서 써야할지 어떨지 모르겠네요. (디자인패턴에 관한 책을 본지가 좀 오래되서...)

타로님 방식으로 쓰면 개발자가 개별 작업할때는 편합니다만 전체적인 모듈화가 힘듭니다.
큰 프로젝트가 아니라면 타로님 방식으로 쓰는 것도 괜찮을 것 같습니다.


디렉토리가 분리되어 있어서 실무에서는 _m.php, _v.php 등의 접미사로 모델, 뷰를 구분하며
이클립스나 phpdesigner 등의 ide에서 지원하는 이동기능(goto declalation)을 이용하여
개발을 합니다.
타로 / 2012/01/09 14:25:35 / 추천 0
 웅파/ 웅파님 조언 감사합니다.  matchbox 부분을 참조하겠습니다. ^^

마웃냥어 / 2012/05/08 10:18:54 / 추천 0
기본적인건지도 모르겠는데요. 
저처럼 헤메는 사람도 있을거 같아서 적습니다.

폴더에다 설치 해놓고 테스트 하려면 .htacces 파일에서 RewriteRule을 변경해야 됩니다.

예를 들어서
 
http://localhost/ci/index.php 가 기본 패스고
아래 처럼 동작한다면
http://localhost/ci/index.php/welcome
http://localhost/ci/index.php/auth/login

웹루트/ci/.htaccess파일에서 아래 부분을 변경해주시면 동작합니다.
RewriteRule ^(.*)$ index.php/$1 [L] -> RewriteRule ^(.*)$ ci/index.php/$1 [L]


yishero / 2012/12/10 17:55:16 / 추천 0
웅파님 감사합니다. 드뎌 인덱스를 몰아냈네요.
그리고 마냥웃어님....이 아니라 마웃냥어님 덧글도 도움되었어요. 감사합니다.
꾸숑 / 2013/01/17 01:58:29 / 추천 0
웅파님 감사합니다.

.htaccess 에 대한 공부가 되었습니다.

index.php도 죽이고 여러가지 다른부분에 응용할수 있게 되었네요^^
대윤 / 2013/03/26 22:09:37 / 추천 0
 apache2 에서 rewrite 모듈 설정은
ssh에서 $ sudo a2enmod rewrite
하고 Service apache2 restart 

shiry / 2013/04/08 23:19:24 / 추천 0
RewriteRule ^(.*)$ ci/index.php/$1 [L] 로 하면 No input file specified. 라는 에러가 뜹니다.

구글링을 해 본 결과, index.php 뒤에 ? 를 붙이면 사라진다고 하여 잽싸게 수정하니 잘 되네요 :D

RewriteRule ^(.*)$ ci/index.php?/$1 [L]