복붙노트

PHP URL rewrite 구현해보기

PHP

PHP URL rewrite 구현해보기

fancy url 이라고도 하는 건데요.
보통 php 페이지를 보면 주소가 /user_edit.php 이런식으로 파일명.php 로 끝납니다.
이런거 대신에 /user/edit 로 끝나게 바꿔 보자는 거죠.

물론 codeigniter나 라라벨처럼 프레임워크를 쓰면 단방에 해결됩니다만,
프레임워크를 쓸 만큼은 아니지만 url rewrite를 구현해보고자 하는 분들께 도움이 되었으면 좋겟습니다.

디렉토리 구조

Root
|- .htaccess
|- index.php
|- inc
     |- 404.php
     |- 기타 action 파일들.php

아파치 .htaccess 수정하기

우선 아파치에서 url write를 할 수 있게 수정해 줍니다.
웹 프로그램 루트에서 .htaccess 파일을 찾습니다.
숨김파일이라서 안보일 수도 있으니 숨김을 해제하시고 수정해 주세요.
물론 웹 서버에 따라서는 .htaccess 파일 자체가 없는 경우도 있습니다.
그럴 경우 그냥 텍스트 파일로 utf-8 형식으로 만들어 주세요.

RewriteEngine On  
RewriteRule ^inc/.*$ index.php  
RewriteCond %{REQUEST_FILENAME} !-f  
RewriteRule ^(.*)$ index.php [QSA,L]  

이 내용을 적어주세요.

index.php 만들기

웹 루트에 index.php 파일을 만들고 다음 내용을 복사합시다.

 "/picture/(?'text'[^/]+)/(?'id'\d+)",    // '/picture/some-text/51'  
'album'     => "/album/(?'album'[\w\-]+)",              // '/album/album-slug'  
'category'  => "/category/(?'category'[\w\-]+)",        // '/category/category-slug'  
'page'      => "/page/(?'page'about|contact)",          // '/page/about', '/page/contact'  
'post'      => "/(?'post'[\w\-]+)",                     // '/post-slug'  
'home'      => "/"                                      // '/'  
);  

$uri = rtrim( dirname($_SERVER["SCRIPT_NAME"]), '/' );  
$uri = '/' . trim( str_replace( $uri, '', $_SERVER['REQUEST_URI'] ), '/' );  
$uri = urldecode( $uri );  
foreach ( $rules as $action => $rule ) {  
if ( preg_match( '~^'.$rule.'$~i', $uri, $params )) {  
foreach ($params as $key => $value) {  
if (is_int($key) == false){  
$_GET[$key] = $value;  
}  
}  

if (! @include_once( INCLUDE_DIR . $action . '.php' )){  
include( INCLUDE_DIR . '404.php' );  
}  
exit();  
}  
}  
include( INCLUDE_DIR . '404.php' );  
?>  

$rules 에는 어떤 규칙을 적용할 지 적어주세요.

'picture'   => "/picture/(?'text'[^/]+)/(?'id'\d+)",    // '/picture/some-text/51'  

picture 를 예로 들어보면
url이 '/picture/some-text/51' 일 때 작동하고, 파라미터는 text와 id 라는 뜻입니다.

실제 작동할 파일 만들기

index.php 파일 가장 위에 이렇게 적어주었죠?

define( 'INCLUDE_DIR', dirname( __FILE__ ) . '/inc/' );  

그래서 우리는 /inc 디렉토리 아래에 관련 파일을 만들어 줄 꺼에요.

picture 파일 만들기

/inc/picture.php

  
echo "text :" . $_GET['text'] . " id : " . $_GET['id'];  
 

내용은 적당히 알아서 적어주세요 :)
파일은 기존과 동일하게 파라미터를 $_GET 으로 받으셔서 만들어 주시면 됩니다.

404 파일 만들기

/inc/404.php

echo "오류가 발생했습니다.";  

뭐 적당히 html 파일로 만들어 주시면 됩니다.

보안 적용하기

/inc/.htaccess

order deny,allow  
deny from all  
allow from 127.0.0.1  

이 설정은 유저가 /inc/picture.php 를 웹 브라우저에 입력해도 작동하지 않게 해 줍니다.
127.0.0.1 은 로컬호스트, 즉 자신의 컴퓨터입니다.
즉 자신의 컴퓨터에서만 파일을 실행할 수 있다는 뜻입니다.
외부에서 접속하면 아파치 웹서버에서 막아줍니다.

'PHP' 카테고리의 다른 글

php 업로드 용량 설정 변경  (0) 2017.11.17
php로 gmail 보내기  (0) 2017.11.17
PHP 리다이렉트 구현  (0) 2017.11.16
PHP 날짜 차이 계산하기  (0) 2017.11.15
PHP JSON 다루기  (0) 2017.11.14