-
-
- RewriteEngine On
- RewriteRule ^index.php$ - [L]
- RewriteCond %{REQUEST_FILENAME} !-f
- RewriteCond %{REQUEST_FILENAME} !-d
- RewriteRルール (.+) Index.php/$1 [L]
コードをコピー
上記のコードは、URL 構造を Index.php にインポートするものです。具体的な書き換えの詳細については詳しく説明しません。
2. PHP でルーティング ルール設定ファイル Routes.php を設定します。ルールを記述するために単純にハッシュ配列を使用しました。
-
- /**
- * ルーティング構成ファイルの作成手順:
- * ルーティング構成は配列配列内にあり、1 つのレコードがルールを表します
- * 配列キーのデータは一致するパス形式を表します: '/{ などの特定の文字列識別子を使用します。 id}'
- * 文字列には特定の変数を含めることができ、すべての変数は中かっこ {} で囲まれます
- * 配列値は配列配列であり、キー内のパス内の変数に対して特定の処理を実行します
- * 変数は次のように記述されます配列のキー。仕様は、array('id'=>'/d+/','_m'=>'frontpage','_a'=> のように配列の値に記述されます。 'index')
- * 仕様は 2 つのカテゴリに分かれています:
- * 1. 形式判定: 例: '/{id}'=> array('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' =>'frontpage','_a'=>'index') の場合。 /3 を渡すと、システムはそれをindex.php?_m=frontpage&_a=index&id=3 に変換します
- *
- * 一致するルールは、$routes 配列の順序で 1 つずつ一致することです。下位にはマッチングされません。したがって、いくつかの特定の一致ルールを前面に配置し、一般的な一致ルールを背面に配置する必要があります。
- * そうしないと、特定のマッチングルールが実行されない可能性があります
- */
- $routes= array(
- '/' => array('_m'=>'wp_frontpage','_a'=>'index'),
- '/{id}'=> 配列('id'=>'/d+/','_m'=>'wp_frontpage','_a'=>'index'),
- '/{_m }/{_a}/{id}'=> 配列('id'=>'/d+/')、
- '/{_m}/{_a}'=>
-
) コードをコピー 3. ルーティング メカニズムの最も複雑かつ重要な部分はパーサーです。
パーサーは 2 つのクラス (おそらく名前が適切ではありません) で構成されます。
1 つは Route で、これはパーサー全体の外部インターフェイスであり、ルールの解析、URL の照合、変換に使用されます。ただし、これは単なるプロキシであり、実際の操作は直接実行されません。
1 つは RoutePattern です。各 RoutePattern インスタンスは、ルール配列内のレコードに対応します。Route インスタンスには複数の RoutePattern が含まれており、Route 内のすべての操作はすべての内部 RoutePattern インスタンス操作を呼び出して統合します。
クラス Route - {
- private static $instance = null;
-
- private function __construct()
- {
- $routes = array(); Routes.php";
- foreach($routes as $key=>$value){
- $this->routepatterns[]=new RoutePattern($key,$value);
- }
-
- if(!isset($ _SERVER['PATH_INFO'])) false を返します。
- $urlpath= $_SERVER['PATH_INFO'];
- $strip_urlpath=str_replace('/','') ,$urlpath);
- if(!$ismatch&&!empty($strip_urlpath)){
- Content::redirect(PAGE_404);
-
- /**
- * ルーティング ルールを使用して、対応する URL アドレスを照合します。 照合が成功した場合は、対応する URL パラメーターを $_GET に入力します
- * @param string URL アドレス
- * @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 を返す }
-
- public function rewrite_url($urlparams){
- foreach($this->routepatterns as $router){
- $urlstr=$router-> ;rewrite_url($urlparams);
- if($urlstr!==false){
- $urlstr; }
- }
- $actualparams=array();
- foreach($arg=>$val){
- $actualparams[]=$arg."=".urlencode($val);
- $actualparamstr=implode('&', $actualparams);
- $rewriteurl="/index.php"; emptyempty($rewriteurl))$rewriteurl.="?{$actualparamstr}";
- return $rewriteurl;
-
- public static function init()
- {
- if (null == self::$instance) {
- self ::$instance = new Route();
- }
- return self::$instance; }
- }
-
- class RoutePattern{
- //...
- }
-
-
- ルーティングについてRoutePattern のルール解析、URL マッチング、URL 変換の詳細については、スペースとエネルギーが限られているため、今日は詳しく説明しません。次に詳しく分析します。時間。
-
-
-
-
-
-
-
-
-
-
|