URI 라우팅¶
일반적으로 URL 문자열과 해당 컨트롤러 클래스/메소드 사이에는 일대일 관계가 있습니다. URI의 세그먼트는 일반적으로 다음 패턴을 따릅니다:
example.com/class/function/id/
하지만 경우에 따라 URL에 해당하는 것 대신 다른 클래스/메소드가 호출되도록 이 관계를 다시 매핑하고 싶을 수 있습니다.
예를 들어 URL의 프로토타입이 다음과 같기를 원한다고 가정해 보겠습니다:
example.com/product/1/
example.com/product/2/
example.com/product/3/
example.com/product/4/
일반적으로 URL의 두 번째 세그먼트는 메소드 이름을 위한 것이지만 위의 예시에서는 제품 ID가 있습니다. 이를 극복하기 위해 CodeIgniter에서는 URI 핸들러를 다시 매핑할 수 있습니다.
자신만의 라우팅 규칙 설정¶
라우팅 규칙은 application/config/routes.php 파일에 정의됩니다. 거기서 자신만의
라우팅 기준을 지정할 수 있는 $route 라는 배열을 볼 수 있습니다. 라우트는
와일드카드 또는 정규 표현식을 사용하여 지정할 수 있습니다.
와일드카드¶
일반적인 와일드카드 라우트는 다음과 같습니다:
$route['product/:num'] = 'catalog/product_lookup';
라우트에서 배열 키에는 일치할 URI가 포함되고 배열 값에는 재라우팅될 대상이 포함됩니다. 위의 예시에서 URL의 첫 번째 세그먼트에 “product”라는 리터럴 단어가 있고 두 번째 세그먼트에 숫자가 있으면 “catalog” 클래스와 “product_lookup” 메소드가 대신 사용됩니다.
리터럴 값을 일치시키거나 두 가지 와일드카드 유형을 사용할 수 있습니다:
(:num) 은 숫자만 포함하는 세그먼트와 일치합니다. (:any) 는 모든 문자(세그먼트 구분자인 ‘/’ 제외)를 포함하는 세그먼트와 일치합니다.
참고
와일드카드는 실제로 정규 표현식의 별칭으로, :any 는 [^/]+ 로, :num 은 [0-9]+ 로 각각 변환됩니다.
참고
라우트는 정의된 순서대로 실행됩니다. 상위 라우트가 항상 하위 라우트보다 우선합니다.
참고
라우트 규칙은 필터가 아닙니다! 예를 들어 ‘foo/bar/(:num)’ 규칙을 설정해도 유효한 라우트라면 비숫자 값으로 컨트롤러 Foo 와 메소드 bar 가 호출되는 것을 막지 않습니다.
예시¶
라우팅 예시입니다:
$route['journals'] = 'blogs';
첫 번째 세그먼트에 “journals”라는 단어가 포함된 URL은 “blogs” 클래스로 다시 매핑됩니다.
$route['blog/joe'] = 'blogs/users/34';
blog/joe 세그먼트가 포함된 URL은 “blogs” 클래스와 “users” 메소드로 다시 매핑됩니다. ID는 “34”로 설정됩니다.
$route['product/(:any)'] = 'catalog/product_lookup';
첫 번째 세그먼트에 “product”가 있고 두 번째에 무엇이든 있는 URL은 “catalog” 클래스와 “product_lookup” 메소드로 다시 매핑됩니다.
$route['product/(:num)'] = 'catalog/product_lookup_by_id/$1';
첫 번째 세그먼트에 “product”가 있고 두 번째에 숫자가 있는 URL은 “catalog” 클래스와 “product_lookup_by_id” 메소드로 다시 매핑되고 일치 항목이 변수로 메소드에 전달됩니다.
중요
선행/후행 슬래시를 사용하지 마세요.
정규 표현식¶
원하는 경우 정규 표현식을 사용하여 라우팅 규칙을 정의할 수 있습니다. 모든 유효한 정규 표현식과 역참조가 허용됩니다.
참고
역참조를 사용하는 경우 이중 백슬래시 구문 대신 달러 구문을 사용해야 합니다.
일반적인 정규식 라우트는 다음과 같습니다:
$route['products/([a-z]+)/(\d+)'] = '$1/id_$2';
위의 예시에서 products/shirts/123과 유사한 URI는 대신 “shirts” 컨트롤러 클래스와 “id_123” 메소드를 호출합니다.
정규 표현식을 사용하면 한 번에 여러 세그먼트를 캡처할 수 있습니다. 예를 들어 사용자가 웹 애플리케이션의 비밀번호로 보호된 영역에 접근하여 로그인 후 동일한 페이지로 다시 리디렉션하고 싶은 경우 다음 예시가 유용합니다:
$route['login/(.+)'] = 'auth/login/$1';
참고
위의 예시에서 $1 플레이스홀더에 슬래시가 포함된 경우 Auth::login() 에
전달될 때 여전히 여러 매개변수로 분할됩니다.
정규 표현식에 대해 모르고 더 배우고 싶다면 regular-expressions.info 가 좋은 출발점이 될 수 있습니다.
참고
와일드카드와 정규 표현식을 혼합하여 사용할 수도 있습니다.
콜백¶
일반적인 라우팅 규칙 대신 콜백을 사용하여 역참조를 처리할 수 있습니다. 예시:
$route['products/([a-zA-Z]+)/edit/(\d+)'] = function ($product_type, $id)
{
return 'catalog/product_edit/' . strtolower($product_type) . '/' . $id;
};
라우트에서 HTTP 동사 사용¶
HTTP 동사(요청 메소드)를 사용하여 라우팅 규칙을 정의할 수 있습니다. 이는 RESTful 애플리케이션을 구축할 때 특히 유용합니다. 표준 HTTP 동사(GET, PUT, POST, DELETE, PATCH) 또는 PURGE와 같은 사용자 지정 동사를 사용할 수 있습니다. HTTP 동사 규칙은 대소문자를 구분하지 않습니다. 라우트에 배열 키로 동사를 추가하기만 하면 됩니다. 예시:
$route['products']['put'] = 'product/insert';
위의 예시에서 URI “products”에 대한 PUT 요청은 Product::insert() 컨트롤러 메소드를
호출합니다.
$route['products/(:num)']['DELETE'] = 'product/delete/$1';
첫 번째 세그먼트에 “products”가 있고 두 번째에 숫자가 있는 URL에 대한 DELETE 요청은
Product::delete() 메소드로 매핑되며 숫자 값이 첫 번째 매개변수로 전달됩니다.
HTTP 동사 사용은 물론 선택 사항입니다.
예약된 라우트¶
세 가지 예약된 라우트가 있습니다:
$route['default_controller'] = 'welcome';
이 라우트는 URI에 데이터가 없을 때, 즉 루트 URL을 로드할 때 실행되어야 할 액션을
가리킵니다. 설정은 controller/method 값을 받으며 지정하지 않으면 index() 가
기본 메소드입니다. 위의 예시에서는 Welcome::index() 가 호출됩니다.
참고
이 설정의 일부로 디렉터리를 사용할 수 없습니다!
404 페이지가 기본으로 나타나지 않도록 항상 기본 라우트를 설정하는 것을 권장합니다.
$route['404_override'] = '';
이 라우트는 요청된 컨트롤러를 찾을 수 없는 경우 어떤 컨트롤러 클래스를 로드해야 하는지 나타냅니다. 기본 404 에러 페이지를 재정의합니다. ‘default_controller’와 동일한 디렉터리별 규칙이 여기에도 적용됩니다.
show_404() 함수에는 영향을 미치지 않으며, 계속해서
application/views/errors/error_404.php 에 있는 기본 error_404.php 파일을 로드합니다.
$route['translate_uri_dashes'] = FALSE;
불리언 값에서 알 수 있듯이 이것은 정확히 라우트가 아닙니다. 이 옵션을 사용하면 컨트롤러와 메소드 URI 세그먼트에서 대시(‘-‘)를 밑줄로 자동 교체할 수 있습니다. 이를 위해 추가 라우트 항목이 필요한 경우 절약할 수 있습니다. 대시는 유효한 클래스 또는 메소드 이름 문자가 아니며 사용하려고 하면 치명적인 오류가 발생하기 때문에 이것이 필요합니다.