-
-
- RewriteEngine On
- RewriteRule ^index.php$ - [L]
- RewriteCond %{REQUEST_FILENAME} !- f
- RewriteCond %{REQUEST_FILENAME} !-d
- RewriteRule (. ) index.php/$1 [L]
코드 복사
위 코드는 URL 구조를 index.php로 가져오는 것입니다. 구체적인 재작성 세부사항은 반복되지 않습니다.
2. PHP에서 라우팅 규칙 구성 파일인 Routes.php를 설정합니다. 저는 단순히 해시 배열을 사용하여 규칙을 작성했습니다.
-
- /**
- *라우팅 구성 파일 작성 지침:
- * 라우팅 구성은 배열에 있고 하나의 레코드는 규칙을 나타냅니다.
- * 배열 키의 데이터는 일치하는 경로 형식을 나타냅니다. 다음과 같은 특정 문자열 식별자를 사용합니다. as: '/{id}'
- * 문자열에는 특정 변수가 포함될 수 있습니다. 모든 변수는 중괄호로 묶입니다. {}
- * 배열 값은 경로의 변수에 대해 특정 처리를 수행하는 배열 배열입니다.
- * 변수는 배열의 키에 기록되고 사양은 배열의 값에 기록됩니다. 예: array('id'=>'/d /','_m'=> ;'frontpage','_a'= >'index')
- * 사양은 두 가지 범주로 나뉩니다.
- * 1. 형식 판단: 예를 들어 '/{id}'=> id'=>'/d /','_m '=>'frontpage','_a'=>'index') 예를 들어 'id'=>'/d /'는 형식 판단입니다. ,
- *는 id 변수가 숫자만 가능하다는 의미이며, 형식 판단 후 정규식만 사용할 수 있습니다. PHP에는 정규 클래스가 없으므로 '/XXX/', '# 형식으로 문자열을 지정합니다. XXX#' 정규 표현식
- * 2. 기본 매개변수: '/ {id}'=> array('id'=>'/d /','_m'=>'frontpage', '_a'=>'index') 예를 들어 '_m'=> ;'frontpage'가 기본 매개변수인 경우
- * 이전 경로에는 _m, _a 정보가 없으므로 기본 매개변수가 사용됩니다. _m 및 _a 값으로 나중에
- *
- * 따라서 규칙의 경우 '/{id}'=> array('id'=>'/d /','_m'=> ;'첫 페이지','_a'=>'색인'). /3을 전달하면 시스템이 index.php?_m=frontpage&_a=index&id=3으로 변환합니다.
- *
- * 규칙 매칭은 $routes 배열 순서대로 하나씩 매칭하는 것입니다. 일단 일치하면 아래쪽으로 일치하지 않습니다. 따라서 일부 구체적인 매칭 규칙은 앞쪽에 배치하고 일반적인 매칭 규칙은 뒤쪽에 배치해야 합니다.
- * 그렇지 않으면 특정 매칭 규칙이 실행되지 않을 수 있습니다
- */
- $routes= array(
- '/' => array('_m'=> ;'wp_frontpage','_a'=>'index'),
- '/{id}'=> array('id'=>'/d /','_m'=>'wp_frontpage ','_a'=>'index'),
- '/{_m}/{_a}/{id}'=> array('id'=>'/d /'),
- '/{_m}/{_a}'=> array()
- )
코드 복사
3. 라우팅 메커니즘에서 가장 복잡하고 중요한 부분은 파서입니다.
파서는 두 개의 클래스(아마도 이름이 잘못 지정되었을 수 있음)로 구성됩니다.
하나는 전체 파서의 외부 인터페이스이며 규칙을 구문 분석하고 URL을 일치시키고 변환하는 데 사용되는 Route입니다. 그러나 이는 단지 프록시일 뿐이며 실제 작업은 프록시에 의해 직접 수행되지 않습니다.
하나는 RoutePattern입니다. 각 RoutePattern 인스턴스는 규칙 배열의 레코드에 해당합니다. Route 인스턴스에는 여러 RoutePattern이 포함되어 있으며 Route의 모든 작업은 모든 내부 RoutePattern 인스턴스 작업을 호출하고 이를 통합합니다.
-
- 클래스 경로
- {
- private static $instance = null
- private $routepatterns=array(); > 개인 함수 __construct()
- {
- $routes = array();
- include ROOT."/routes.php"
- foreach($routes as $key=>$value){
- $this->routepatterns[]=new RoutePattern($key,$value);
- }
-
- if(!isset($_SERVER['PATH_INFO'])) return false; 🎜> $urlpath= $_SERVER['PATH_INFO'];
- $ismatch=$this->match_url($urlpath)
- $strip_urlpath=str_replace('/','',$urlpath); 🎜> if(!$ismatch&&!emptyempty($strip_urlpath)){
- Content::redirect(PAGE_404)
- }
- }
-
- /**
- * 라우팅 규칙을 사용하여 해당 URL 주소를 일치시킵니다. 일치에 성공하면 해당 URL 매개변수를 $_GET에 넣습니다.
- * @param string url address
- * @return bool 일치 성공 여부
- */
- 공개 함수 match_url($urlpath){
- foreach($this->routepatterns as $router){
- $urlargs=$router->match_url($urlpath)
- if($urlargs! ==false){
- $_GET=array_merge($urlargs,$_GET);
- true를 반환합니다.
- }
- }
- false를 반환합니다. 공용 함수 rewrite_url($urlparams){
- foreach($this->routepatterns as $router){
- $urlstr=$router->rewrite_url($urlparams)
- if($urlstr!= =false){
- $urlstr; 반환
- }
- }
- $actualparams=array()
- foreach($urlparams as $arg=>$val){
- $ Actualparams[]=$arg."=".urlencode($val);
- }
- $actualparamstr=implode('&', $actualparams)
- $rewriteurl="/index.php";
- if(!emptyempty($rewriteurl))$rewriteurl.="?{$actualparamstr}";
- return $rewriteurl
- }
-
- 공개 정적 함수 init()
- {
- if (null == self::$instance) {
- self::$instance = new Route()
- }
- return self::$instance
- }
- }
-
- class RoutePattern{
- //...
- }
-
-
- 코드 복사
-
-
- 라우팅 구성 파일 정보 주요 세부 사항 RoutePattern의 규칙 분석, URL 일치 및 URL 변환에 대한 자세한 내용은 공간과 에너지가 제한되어 있으므로 오늘은 자세히 설명하지 않겠습니다. 다음번.
-
|