>  기사  >  백엔드 개발  >  PHP에서 간단한 의사 정적 URL을 구현하는 메커니즘 소개

PHP에서 간단한 의사 정적 URL을 구현하는 메커니즘 소개

WBOY
WBOY원래의
2016-07-25 09:05:301284검색
  1. RewriteEngine On
  2. RewriteRule ^index.php$ - [L]
  3. RewriteCond %{REQUEST_FILENAME} !- f
  4. RewriteCond %{REQUEST_FILENAME} !-d
  5. RewriteRule (. ) index.php/$1 [L]
코드 복사

위 코드는 URL 구조를 index.php로 가져오는 것입니다. 구체적인 재작성 세부사항은 반복되지 않습니다.

2. PHP에서 라우팅 규칙 구성 파일인 Routes.php를 설정합니다. 저는 단순히 해시 배열을 사용하여 규칙을 작성했습니다.

  1. /**
  2. *라우팅 구성 파일 작성 지침:
  3. * 라우팅 구성은 배열에 있고 하나의 레코드는 규칙을 나타냅니다.
  4. * 배열 키의 데이터는 일치하는 경로 형식을 나타냅니다. 다음과 같은 특정 문자열 식별자를 사용합니다. as: '/{id}'
  5. * 문자열에는 특정 변수가 포함될 수 있습니다. 모든 변수는 중괄호로 묶입니다. {}
  6. * 배열 값은 경로의 변수에 대해 특정 처리를 수행하는 배열 배열입니다.
  7. * 변수는 배열의 키에 기록되고 사양은 배열의 값에 기록됩니다. 예: array('id'=>'/d /','_m'=> ;'frontpage','_a'= >'index')
  8. * 사양은 두 가지 범주로 나뉩니다.
  9. * 1. 형식 판단: 예를 들어 '/{id}'=> id'=>'/d /','_m '=>'frontpage','_a'=>'index') 예를 들어 'id'=>'/d /'는 형식 판단입니다. ,
  10. *는 id 변수가 숫자만 가능하다는 의미이며, 형식 판단 후 정규식만 사용할 수 있습니다. PHP에는 정규 클래스가 없으므로 '/XXX/', '# 형식으로 문자열을 지정합니다. XXX#' 정규 표현식
  11. * 2. 기본 매개변수: '/ {id}'=> array('id'=>'/d /','_m'=>'frontpage', '_a'=>'index') 예를 들어 '_m'=> ;'frontpage'가 기본 매개변수인 경우
  12. * 이전 경로에는 _m, _a 정보가 없으므로 기본 매개변수가 사용됩니다. _m 및 _a 값으로 나중에
  13. *
  14. * 따라서 규칙의 경우 '/{id}'=> array('id'=>'/d /','_m'=> ;'첫 페이지','_a'=>'색인'). /3을 전달하면 시스템이 index.php?_m=frontpage&_a=index&id=3으로 변환합니다.
  15. *
  16. * 규칙 매칭은 $routes 배열 순서대로 하나씩 매칭하는 것입니다. 일단 일치하면 아래쪽으로 일치하지 않습니다. 따라서 일부 구체적인 매칭 규칙은 앞쪽에 배치하고 일반적인 매칭 규칙은 뒤쪽에 배치해야 합니다.
  17. * 그렇지 않으면 특정 매칭 규칙이 실행되지 않을 수 있습니다
  18. */
  19. $routes= array(
  20. '/' => array('_m'=> ;'wp_frontpage','_a'=>'index'),
  21. '/{id}'=> array('id'=>'/d /','_m'=>'wp_frontpage ','_a'=>'index'),
  22. '/{_m}/{_a}/{id}'=> array('id'=>'/d /'),
  23. '/{_m}/{_a}'=> array()
  24. )
코드 복사

3. 라우팅 메커니즘에서 가장 복잡하고 중요한 부분은 파서입니다. 파서는 두 개의 클래스(아마도 이름이 잘못 지정되었을 수 있음)로 구성됩니다. 하나는 전체 파서의 외부 인터페이스이며 규칙을 구문 분석하고 URL을 일치시키고 변환하는 데 사용되는 Route입니다. 그러나 이는 단지 프록시일 뿐이며 실제 작업은 프록시에 의해 직접 수행되지 않습니다. 하나는 RoutePattern입니다. 각 RoutePattern 인스턴스는 규칙 배열의 레코드에 해당합니다. Route 인스턴스에는 여러 RoutePattern이 포함되어 있으며 Route의 모든 작업은 모든 내부 RoutePattern 인스턴스 작업을 호출하고 이를 통합합니다.

  1. 클래스 경로
  2. {
  3. private static $instance = null
  4. private $routepatterns=array(); > 개인 함수 __construct()
  5. {
  6. $routes = array();
  7. include ROOT."/routes.php"
  8. foreach($routes as $key=>$value){
  9. $this->routepatterns[]=new RoutePattern($key,$value);
  10. }
  11. if(!isset($_SERVER['PATH_INFO'])) return false; 🎜> $urlpath= $_SERVER['PATH_INFO'];
  12. $ismatch=$this->match_url($urlpath)
  13. $strip_urlpath=str_replace('/','',$urlpath); 🎜> if(!$ismatch&&!emptyempty($strip_urlpath)){
  14. Content::redirect(PAGE_404)
  15. }
  16. }
  17. /**
  18. * 라우팅 규칙을 사용하여 해당 URL 주소를 일치시킵니다. 일치에 성공하면 해당 URL 매개변수를 $_GET에 넣습니다.
  19. * @param string url address
  20. * @return bool 일치 성공 여부
  21. */
  22. 공개 함수 match_url($urlpath){
  23. foreach($this->routepatterns as $router){
  24. $urlargs=$router->match_url($urlpath)
  25. if($urlargs! ==false){
  26. $_GET=array_merge($urlargs,$_GET);
  27. true를 반환합니다.
  28. }
  29. }
  30. false를 반환합니다. 공용 함수 rewrite_url($urlparams){
  31. foreach($this->routepatterns as $router){
  32. $urlstr=$router->rewrite_url($urlparams)
  33. if($urlstr!= =false){
  34. $urlstr; 반환
  35. }
  36. }
  37. $actualparams=array()
  38. foreach($urlparams as $arg=>$val){
  39. $ Actualparams[]=$arg."=".urlencode($val);
  40. }
  41. $actualparamstr=implode('&', $actualparams)
  42. $rewriteurl="/index.php";
  43. if(!emptyempty($rewriteurl))$rewriteurl.="?{$actualparamstr}";
  44. return $rewriteurl
  45. }
  46. 공개 정적 함수 init()
  47. {
  48. if (null == self::$instance) {
  49. self::$instance = new Route()
  50. }
  51. return self::$instance
  52. }
  53. }
  54. class RoutePattern{
  55. //...
  56. }
  57. 코드 복사
  58. 라우팅 구성 파일 정보 주요 세부 사항 RoutePattern의 규칙 분석, URL 일치 및 URL 변환에 대한 자세한 내용은 공간과 에너지가 제한되어 있으므로 오늘은 자세히 설명하지 않겠습니다. 다음번.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.