'rewrite'에 해당되는 글 2건

  1. 2008/03/13 제 1강 CakePHP 디렉토리 구성 살펴보기
  2. 2008/03/03 .htaccess RewriteRule (퍼온글)

본 문서 저작권은 백성용(helloboy.co.kr)에게 있고 무단도용시 법적 제재는 가하지 않습니다.  복사, 재배포, 게시하고자 하는 경우에는 가능한 출처와 작성자는 정확히 밝혀주세요.

오늘은 내용을 올리진 않겠습니다. 현재 일하는 시간이라서 ~ ㅎ
주말에 올릴께요~

CakePHP 디렉토리 구성도:

cake/
|-- app     - 어플리케이션 디렉토리
|   |-- config    - 라우터, 데이터베이스, ACL 등의 설정파일
|   |   |-- acl.ini.php
|   |   |-- bootstrap.php
|   |   |-- core.php   - 전역 설정파일
|   |   |-- database.php  - 데이터베이스 설정파일
|   |   |-- database.php.default - 데이터베이스 설정파일(Sample file)
|   |   |-- inflections.php  - 인플렉션 설정파일
|   |   |-- routes.php   - 라우트 설정파일
|   |   `-- sql
|   |       |-- db_acl.sql
|   |       `-- sessions.sql
|   |-- controllers   - 컨트롤러 디렉토리
|   |   `-- components   - 컴포넌트 디렉토리
|   |       `-- empty
|   |-- index.php   - 어플리케이션 디렉토리를 DocumentRoot로 설정하는 파일
|   |-- models    - 모델 디렉토리
|   |   `-- empty
|   |-- plugins    - 플러그인 디렉토리
|   |   `-- empty
|   |-- tmp    - 캐시/로그/세션/임시파일등을 수용하는 디렉토리
|   |   |-- cache
|   |   |   |-- empty
|   |   |   |-- models
|   |   |   |   `-- empty
|   |   |   |-- persistent
|   |   |   |   `-- empty
|   |   |   `-- views
|   |   |       `-- empty
|   |   |-- empty
|   |   |-- logs
|   |   |   `-- empty
|   |   |-- sessions
|   |   |   `-- empty
|   |   `-- tests
|   |       `-- empty
|   |-- vendors    - 어플리케이션용 써드 파티 라이브러리 디렉토리
|   |   `-- empty
|   |-- views    - 뷰 디렉토리
|   |   |-- elements   - 사이즈가 적은 뷰를 위한 디렉토리
|   |   |   `-- empty
|   |   |-- errors   - 에러 페이지를 위한 디렉토리
|   |   |   `-- empty
|   |   |-- helpers   - 헬퍼 디렉토리
|   |   |   `-- empty
|   |   |-- layouts   - 레이아웃 디렉토리
|   |   |   `-- empty
|   |   `-- pages   - 정적파일용 디렉토리
|   |       `-- empty
|   `-- webroot    - 어플리케이션 DocumentRoot용 디렉토리(css/js/img/files 등의 정규파일)
|       |-- css
|       |   `-- cake.generic.css
|       |-- css.php
|       |-- favicon.ico
|       |-- files
|       |-- img
|       |   |-- cake.power.png
|       |   |-- w3c_css.png
|       |   `-- w3c_xhtml10.png
|       |-- index.php
|       `-- js
|           `-- vendors.php
|-- cake    - CakePHP의 핵심 라이브러리 디렉토리
|   |-- LICENSE.txt
|   |-- VERSION.txt
|   |-- app_controller.php
|   |-- app_model.php
|   |-- basics.php
|   |-- bootstrap.php
|   |-- config
|   |   |-- config.php
|   |   `-- paths.php
|   |-- dispatcher.php
|   |-- libs
|   |   |-- cache.php
|   |   |-- cake_log.php
|   |   |-- class_registry.php
|   |   |-- configure.php
|   |   |-- controller
|   |   |   |-- component.php
|   |   |   |-- components
|   |   |   |   |-- acl.php
|   |   |   |   |-- acl_base.php
|   |   |   |   |-- dbacl
|   |   |   |   |   |-- db_acl.php
|   |   |   |   |   `-- models
|   |   |   |   |       |-- aclnode.php
|   |   |   |   |       |-- aco.php
|   |   |   |   |       |-- acoaction.php
|   |   |   |   |       |-- aro.php
|   |   |   |   |       `-- aros_aco.php
|   |   |   |   |-- iniacl
|   |   |   |   |   `-- ini_acl.php
|   |   |   |   |-- request_handler.php
|   |   |   |   |-- security.php
|   |   |   |   `-- session.php
|   |   |   |-- controller.php
|   |   |   |-- pages_controller.php
|   |   |   `-- scaffold.php
|   |   |-- error.php
|   |   |-- file.php
|   |   |-- flay.php
|   |   |-- folder.php
|   |   |-- inflector.php
|   |   |-- legacy.php
|   |   |-- model
|   |   |   |-- connection_manager.php
|   |   |   |-- datasources
|   |   |   |   |-- datasource.php
|   |   |   |   `-- dbo_source.php
|   |   |   |-- dbo
|   |   |   |   |-- dbo_adodb.php
|   |   |   |   |-- dbo_mssql.php
|   |   |   |   |-- dbo_mysql.php
|   |   |   |   |-- dbo_mysqli.php
|   |   |   |   |-- dbo_odbc.php
|   |   |   |   |-- dbo_pear.php
|   |   |   |   |-- dbo_postgres.php
|   |   |   |   `-- dbo_sqlite.php
|   |   |   |-- model.php
|   |   |   |-- model_php4.php
|   |   |   `-- model_php5.php
|   |   |-- neat_array.php
|   |   |-- neat_string.php
|   |   |-- object.php
|   |   |-- router.php
|   |   |-- sanitize.php
|   |   |-- security.php
|   |   |-- session.php
|   |   |-- set.php
|   |   |-- validators.php
|   |   `-- view
|   |       |-- helper.php
|   |       |-- helpers
|   |       |   |-- ajax.php
|   |       |   |-- cache.php
|   |       |   |-- form.php
|   |       |   |-- html.php
|   |       |   |-- javascript.php
|   |       |   |-- number.php
|   |       |   |-- session.php
|   |       |   |-- text.php
|   |       |   `-- time.php
|   |       |-- templates
|   |       |   |-- elements
|   |       |   |   `-- dump.thtml
|   |       |   |-- errors
|   |       |   |   |-- error404.thtml
|   |       |   |   |-- missing_action.thtml
|   |       |   |   |-- missing_component_class.thtml
|   |       |   |   |-- missing_component_file.thtml
|   |       |   |   |-- missing_connection.thtml
|   |       |   |   |-- missing_controller.thtml
|   |       |   |   |-- missing_helper_class.thtml
|   |       |   |   |-- missing_helper_file.thtml
|   |       |   |   |-- missing_layout.thtml
|   |       |   |   |-- missing_model.thtml
|   |       |   |   |-- missing_scaffolddb.thtml
|   |       |   |   |-- missing_table.thtml
|   |       |   |   |-- missing_view.thtml
|   |       |   |   |-- private_action.thtml
|   |       |   |   `-- scaffold_error.thtml
|   |       |   |-- layouts
|   |       |   |   |-- ajax.thtml
|   |       |   |   |-- default.thtml
|   |       |   |   `-- flash.thtml
|   |       |   |-- pages
|   |       |   |   `-- home.thtml
|   |       |   `-- scaffolds
|   |       |       |-- add.thtml
|   |       |       |-- edit.thtml
|   |       |       |-- index.thtml
|   |       |       `-- view.thtml
|   |       `-- view.php
|   `-- scripts
|       |-- acl.php
|       |-- bake.php
|       `-- templates
|           |-- skel
|           |   |-- app_controller.php
|           |   |-- app_model.php
|           |   |-- config
|           |   |   |-- acl.ini.php
|           |   |   |-- bootstrap.php
|           |   |   |-- core.php
|           |   |   |-- database.php.default
|           |   |   |-- inflections.php
|           |   |   |-- routes.php
|           |   |   `-- sql
|           |   |       |-- db_acl.sql
|           |   |       `-- sessions.sql
|           |   |-- controllers
|           |   |   |-- components
|           |   |   `-- pages_controller.php
|           |   |-- index.php
|           |   |-- models
|           |   |   `-- behaviors
|           |   |-- plugins
|           |   |-- tmp
|           |   |   |-- cache
|           |   |   |   |-- models
|           |   |   |   |-- persistent
|           |   |   |   `-- views
|           |   |   |-- logs
|           |   |   |-- sessions
|           |   |   `-- tests
|           |   |-- vendors
|           |   |-- views
|           |   |   |-- elements
|           |   |   |-- errors
|           |   |   |-- helpers
|           |   |   |-- layouts
|           |   |   |   |-- ajax.thtml
|           |   |   |   |-- default.thtml
|           |   |   |   `-- flash.thtml
|           |   |   `-- pages
|           |   `-- webroot
|           |       |-- css
|           |       |   `-- cake.generic.css
|           |       |-- css.php
|           |       |-- favicon.ico
|           |       |-- files
|           |       |-- img
|           |       |   `-- cake.power.png
|           |       |-- index.php
|           |       `-- js
|           |           `-- vendors.php
|           `-- views
|               `-- home.thtml
|-- docs
|   |-- CHANGELOG.txt
|   |-- COPYING.txt
|   |-- INSTALL.txt
|   `-- README.txt
|-- index.php
`-- vendors    - 시스템 전체에 사용되는 써드 파티 라이브러리용 디렉토리

이올린에 북마크하기(0) 이올린에 추천하기(0)
Posted by 백성용 헬로우보이

출처 : http://leos.tistory.com/49

아파치 모듈중에서 유용한 모듈이 많이 있는데, 그 중에 한 가지가 rewrite 모듈이다.
의외로 설치하는 방법이 간단하다. 설치가 간단한 반면에 그 기능 활용을 많다고 생각이 든다.


정규식 표현을 알면 보다 쉽게 사용하니, 먼저 정규식표현을 잘 익혀두자. rewrite 모듈을 이용하면 장점이 하나의 도메인만 있으면 서브도메인을 생성하여 각기 다른 내용의 홈페이지를 운영할 수 있다는 것이다.


photo.tt.co.kr 또는 blog.tt.co.kr, shop.tt.co.kr, intra.tt.co.kr 식으로 말이다.
굳이 다른 도메인을 써야 할 이유가 없다면 홍보에도 도움이 되는 서브도메인을 이용한 홈페이지를 만들어서 운영해 보자.


국내에서는 유일하게 오늘과내일(
http://tt.co.kr)에서 이 서비스를 도입하여 웹호스팅 서비스를 하고 있다.

 

웹서버에서 아파치를 컴파일하고, php도 다시 컴파일 해 준다. 제대로 모듈이 아파치에 적용되었는지 확인하고, 네임서버에서도 * 문자로 모든 2차 네임서버에 대해서 아이피 설정만 해 두면 된다.


자~ 쉽게 따라해 보자.

 

Apache rewrite Module

 

Apache 는 추가적으로 사용할 수 있는 유용한 모듈들을 제공합니다. 이번강좌에서는 Apache의 URL Rewrite 모듈을 사용하기 위한 컴파일,설치와 httpd.conf의 설정방법 그리고 활용방법에 대해 알아보겠습니다.

 

Apache 다운로드 : http://www.apache.org

1. rewrite 모듈을 사용하기 위한 Apache 컴파일옵션

Rewrite 모듈을 쓰기위한 Apache 컴파일 옵션은 --enable-rewrite 입니다. Configure 실행시에  --enable-rewrite 만 추가하시면 Apache에서 rewrite 모듈을 사용할 있게 됩니다.

[root@superuser root]# ./cofigure prefix=/usr/local/apache2 --enable-rewrite

[root@superuser root]# make

[root@superuser root]# make install

 

1. Rewrite 를 적용할 수 있는 범위

Rewrite 설정은 Server Config, Virtual Host, Directory, .htaccess 에 설정할 수 있습니다. Apache 서버 전체에 Global 설정과 특정 가상호스트에만 적용하도록 할수 있고 특정 디렉토리에만 적용시킬수도 있습니다.

 

2. Rewrite 모듈 지시자

RewriteEngine

설정문법 : RewriteEngine On|Off

Rewriteing 엔진을 사용할지 여부를 설정합니다. 기본설정은 당연히 Off로 되어 있으며 RewriteEngine On 으로 설정하지 않는 이상 Rewritng 엔진을 활성화 시키지 않습니다.

 

현재 Apache에서 실행중인 모든 RewriteRule을 비활성화 시킬 때 RewriteRule 라인을 주석처리 하기보다 RewriteEngin Off 로 설정하는 것이 더 간편하고 올바른방법입니다.

 

RewreteLog

설정문법 : RewriteLog FILE-PATH

RewriteLog 지시자는 Rewrite 엔진의 로그를 그록할 파일을 지정합니다.
RewriteLog 파일을 항상 남기기 보다 잘못된 Rewrite 규칙들을 디버킹할 때 사용하기를 권장합니다. 아파치와 마찬가지로 RewriteLog 파일도 방문자수가 많은사이트에서는 감당못할 정도의 로그파일을 남기기 때문에 시스템 여유공간이 많이 없는 시스템에서는 해당 파티션의 하드사용률 100%로 인한 재앙(?)을 불러올수도 있습니다. 다음강좌에서 소개될 로그파일 분석에서 언급하겠지만 로그파일은 유용한 디버깅 도구가 될수 있지만 잘못 관리하면 시스템의 치명적인 악으로 존재할수도 있습니다.


RewriteLog 지시자는 반드시 RewriteLogLevel 지시자와 함께 사용하여야 됩니다.

 

RewriteLogLevel

설정문법 : RewriteLogLevel Level

RewriteLogLevel 지시자는 RewriteLog 지시자로 설정한 로그파일에 기록할 로그들에 대해 얼마나 자세한 내용을 로그로 남길것인가에 대해 설정하는 지시자입니다.

기록할 로그 Level 은 0 ~ 9까지 사용할 수 있으며 0은 로그를 기록하지 않겠다는 의미입니다. Level 숫자가 높을수록 자세한 로그를 기록합니다

 

RewriteCond

설정문법 : RewriteCond TestStirng CondPattern

RewriteCond 지시자는 RewriteRule 과 함께 사용되는 규칙으로 RewriteCond 다음에 오는 RewriteRule은 RewrieteCond 에서 설정한 패턴과 일치해야지만 RewriteRule들을 실행한다.

 

RewriteRule

설정문법 : RewriteRule Pattern Substitution

Rewrite 모듈의 실질적인 Rewrite 규칙들을 적용하는 지시자입니다.

Pattern(Input URL) 을 Subtitution(Return URL)로 변경하기 위한 모든 규칙들은 이 지시자를 사용해서 설정해야 됩니다.


Pattern(Input URL) 에는 Perl 정규표현식을 사용할수 있기 때문에 Input URL 의 규칙을 유연하게 적용할 수 있습니다. 이 강좌에서는 기초적인 정규표현식 사용방법만 다루고 정규표현식에 대해 자세히 알고 싶으신 분은 정규표현식에 대한 강좌나 인터넷 문서를 참고하시기 바랍니다.

 

정규표현식 기초

. : 다수의 한문자

? : 0개 이상의 한문자

* : 0개 이상의 문자 또는 문자열

+ : 1개 이상의 문자 또는 문자열

(chars) : (, ) 안의 문자또는 문자열을 그룹으로 묶습니다. 이 문자그룹은 Substitution(return URL)에서 $N 의 변수로 활용할수 있습니니다.

^ : 문자열의 첫문(열)을 지정합니다.

$ : 문자열의 끝 문자(열)을 지정합니다.

\(역슬래쉬) : 정규표현식에서 특별한 의미로 사용되는 문자의 특수기능을 제거합니다.(예:(, ), [, ] . 등)

{n} : 정확히 n번 반복

{n,} : n번 이상 반복

{n,m} : n 이상 m 이하 반복

[chars] : 문자들의 범위 또는 표현할 수 있는 문자들을 설정합니다.
예) [a-z] : a 부터 z 까지의 소문자, [tT] : 소문자 t 또는 대문자 T

 

정규표현식 단축표현들

[:alpha:] : 알파벳. [a-zA-Z] 와 같은 표현

[:alnum:] : 알파벳과 숫자. [a-zA-Z0-9] 와 같은 표현

[:digit:] : 숫자 [0-9] 와 같은 표현

[:upper:] : 대문자. [A-Z] 와 같은 표현

 

RewriteRule 플래그

forbidden|F : 요청하는 페이지를 403 에러로 redirect 시킵니다. RedirectRule 이 적용되고 있는 페이지를 일시적으로 사용중단을 시키거나 사용자로 하여금 페이지 접근을 할수 없게 할 때 사용합니다.

) RewriteRule ^/test /home/blog/html/test.php [F]

사용자가 /test 로 접근할 경우 403 에러를 보냅니다.


gone|G
: 요청하는 페이지를 410 에러로 redirect 시킵니다. 410 에러는 페이지가 사라젔거나 존재하지 않는다는 메시지입니다. 이것도 forbidden 과 마찬가지로 RedirectRule 이 적용되던 페이지를 일시적으로 중단시킬 때 유용하게 사용할 수 있습니다.


last|L
: 이 플래그가 적용되면 뒤에 어떤 룰이 있더라도 이룰 아래의 규칙들은 적용되지 않고 RewriteRule 을 빠져나가게 됩니다. C, Perl, PHP 프로그램에서 루프를 빠져나가는 break 와 같은 의미를 가집니다.


chain|C
: 이 플래그의 결과를 다음 RewriteRule 의 input 값으로 사용합니다.
예)

RewriteRule ^(.+) %{HTTP_HOST}$1 [C]

RewriteRule ^([^.]+)\.domain\.com(.*) /home/$1/public_html$2

이 룰은 사용자 홈의 도메인을 2차 도메인으로 자동설정해 줄 때 많이 쓰는 룰입니다. RewriteRule의 input은 도메인을 제외한 URI 를 인식하기 때문에 도메인까지 인식을 시켜서 다음 RewriteRule 로 체크를 하기 위해 사용한 것입니다.


http://user_id.domain.com/hello.html 이란 요청이 들어오면  /home/user_id/public_html/hello.html 로 redirect 시켜줍니다. 위와 같이 2차 도메인을 이용해 계정 사용자의 홈을 지정하기 위해서는 DNS 세팅이 선행되어야 됩니다.

 

RwriteRule 설정예

1. http://yourdomain.com/user_id  ->  http://yourdomain.com/home.php?id=user_id

 

RewriteRule ^/([a-zA-Z0-9])$   /home/user_id/public_html/home.php?id=$1

설명 : 도메인(http://yourdomain.com) 뒤에 오는 영문숫자로된 문자열을 지정하면서 그룹으로 묶었습니다. 이렇게 그룹으로 설정된 문자열 Pattern 은 Substitution(return URL) 에서 $1 이라는 변수로 받아 사용하게 됩니다. 즉 http://yourdomain.com/superuser 라는 페이지 요청이 들어오면 실제로는 http://yourdomain.com/home.php?id=superuser 라는 페이지로 redirect 시켜줍니다. 블로그나 카페(동호회) 사이트에서 블로그 사용자의 ID 로 개인 블로그 주소를 부여할 때 http://blog.com/user_id 로 부여해 주지만 실제 실행되는 파일은 이와 같이 redirect 시켜주는 경우가 많습니다.

 

2. http://yourdomain.com/daum  -> http://www.daum.net

RewriteRule ^/daum$  -> http://www.daum.net

설명 : http://yourdomain.com/daum 라는 페이지 요청이 들어오면 도메인이 다른 http://www.daum.net 이라는 페이지로 redirect 시켜줍니다.

 

 

RewriteOptions

설정문법 : RewriteOptions Options

현재 사용할 수 있는 option 은 MaxRedirects=number 를 사용할 수 있으며 설정된 number값에 도달하게 되면 500 Internal Server Error 를 남기고 RewriteRule을 종료합니다.

잘못된 RewriteRule에 의한 무한 루프를 방지하기 위한 목적으로 사용되는데 시스템이 이유없이 다운된다거나 할 때 이 옵션과 Log 기록을 참고하여 디버깅 및 시스템 다운을 방지할 수 있습니다.


이 지사자는 Apache 2.0.45 이상에서 사용할 수 있습니다.

 

3. 실제 적용예

가상호스트 blog.xxx.ac.kr 에 대해 Rewrite Rule을 적용한 예입니다. 이 부분은 실제 운영되는 블로그 사이트를 위해 RewriteRule 을 적용한 예입니다.


DocumentRoot /home/blog/html

ServerName blog.xxx.ac.kr

# 여기까지는 일반적인 가상호스트 설정입니다.

RewriteEngine on

# RewriteRule을 사용하기 위해 On 으로 설정합니다.

 

RewriteLog /home/blog/rewrite_log_admin3.log

RewriteLogLevel 9

# Rewrite 실행중 Log를 남기기 위해 로그파일과 로그레벨을 지정했습니다.

 

RewriteRule ^/tb/([a-zA-Z0-9]+)/([0-9]+)$ /home/blog/html/blog/trackback\.php\?id=$1&post_no=$2

# 위설정은 블로그에 등록된 포스트의 트랙백 주소를 부여하기 위해 설정한 RewriteRule 로써 Pattern에 두개의 그룹이 존재하고 return URL에 순서대로 각 그룹을 $1 과 $2 로 받아 GET 변수로 치환한것입니다.

 

RewriteRule ^/xml/([a-zA-Z0-9]+)$ /home/blog/html/blog/rss_feed\.php\?id=$1

# 각블로그별 RSS 주소를 실제 파일로 지정한것입니다.

 

RewriteCond %{REQUEST_URI}     !^/admin$

RewriteRule ^/([a-zA-Z0-9]+)$ /home/blog/html/blog/main\.php?id=$1

# 먼저 RewriteCond 로 실제 존재하는 admin 이라는 디렉토리를 이어지는 RewriteRule에서 제외시키고 http://domain.com/user_id 로의 요청을 모두 /home/blog/html/blog/main.php?id=user_id로 redirect 시키는 룰입니다.

 

RewriteRule ^/([a-zA-Z0-9]+)/([0-9]+)$ /home/blog/html/blog/main\.php\?id=$1&post_no=$2

# /user_id/1345 로 요청하는 페이지를 /home/blog/html/blog/main.php?id=user_id&post_no=1345 로 redirect 시키는 룰입니다.

 

 

4. 마치면서

위에서 언급한 RewriteRule 뿐만 아니라 여러가지 상황에서 RewriteRule을 잘 활용한다면 아주 유용하게 웹페이지를 컨트롤 할수 있습니다.

RewriteRule 을 세팅하기 이전에 반드시 정규표헌식에 대해 어느정도 공부한후 적용해 보실 것을 권합니다.

이올린에 북마크하기(0) 이올린에 추천하기(0)
Posted by 백성용 헬로우보이