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 세그먼트에서 대시(‘-‘)를 밑줄로 자동 교체할 수 있습니다. 이를 위해 추가 라우트 항목이 필요한 경우 절약할 수 있습니다. 대시는 유효한 클래스 또는 메소드 이름 문자가 아니며 사용하려고 하면 치명적인 오류가 발생하기 때문에 이것이 필요합니다.