강좌게시판

제목 index.php 죽이기!!
글쓴이 변종원(웅파) 작성시각 2011/11/07 22:02:13
댓글 : 25 추천 : 4 스크랩 : 2 조회수 : 114084   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)

댓글

개발뉴비 / 2013/07/15 16:56:12 / 추천 0
저는 서버 아파치안쓰고 iis로하는데 그럴때도 이거대로하면되나요? 404 계속떠서요;;
변종원(웅파) / 2013/07/15 20:20:24 / 추천 0
iis는 다른 모듈써야합니다. iis rewrite 로 검색하면 나올겁니다.
timothy / 2014/02/18 22:12:44 / 추천 0
nginx에서

아래와 같이 설정하니까 되네요^^

혹시 더 좋은 방법을 알고 계신분은 제게 한 수를 가르쳐 주시겠어요?

1. /etc/nginx/conf.d/default.conf
#todo application
    if ($request_uri ~* ^/todo)
    {
        rewrite ^/(.*)$ /todo/index.php?/$1 last;
        break;
    }

# remove access to system folder, also allows a 'System.php' controller
    if ($request_uri ~* ^/system)
    {
        rewrite ^/(.*)$ /index.php?/$1 last;
        break;
    }
# 예외 디렉토리 /js, /img
    if ($request_uri ~* ^/js)
    {
        rewrite ^/js/(.*)$ /js/$1 last;
        break;
    }

    if ($request_uri ~* ^/img)
    {
        rewrite ^/img/(.*)$ /img/$1 last;
        break;
    }
출처: http://www.farinspace.com/codeigniter-nginx-rewrite-rules/
참고: 웹 브라우저로 /todo/index.php/...(생략)... 이라고 했을 때 404나오시는 분들 중에서,
/todo/index.php?/...(생략)...라고 했을 때 정상적으로 나오시는 분들은 위의 설정을 이용하셔요~

2. todo/application/config/config.php
//$config['index_page'] = 'index.php';
$config['index_page'] = '';

hha / 2014/03/19 13:40:18 / 추천 0
오 유용한 정보였습니다. 감사합니다~
초코바 / 2014/05/26 22:52:11 / 추천 0
감사합니다 잘 배웠습니다.
Letz / 2014/09/29 20:49:31 / 추천 0
웹호스팅의 경우 mod_rewrite를 사용하지 못하도록 막혀있으면 어쩌나요??
변종원(웅파) / 2014/09/29 20:53:19 / 추천 0
Letz/ .htaccess 파일은 제공됩니다.
selpa / 2015/05/06 19:50:08 / 추천 0
책 보고 하다가 여기 다시 한번 보고 성공 했습니다... 감사 합니다.
hani / 2017/06/01 11:35:00 / 추천 0
오 감사합니다 !!!!
littlemk / 2018/03/06 10:01:22 / 추천 0

감사합니다! 저 같은 경우엔 웅파님이 쓰신 글대로 했는데도 불구하고 안되길래 한참 헤매이고 있었는데... ㅠㅠ

알고보니 index.php 파일과 htaccess의 경로가 같아야 되었다는 것을 지나치고 왜 계속 안되나 뻘짓하고 있었네요..

다들 이런 실수가 없길 바랍니다! ;)