4

独自のフレームワークの作成に取り組んでおり、大学で学んだよりも高度なプログラミング手法を学ぶことに重点を置いています。.htaccessすべてのページ要求を、要求 URI に基づいてコントローラーとテーマをロードするブートストラップ ファイルにリダイレクトするために使用します。

URL の形式は次のとおりです。site.com/Controller[/optional/multiple/params]

問題は、たとえば、画像または css ファイルを含めようとしているのに、それが存在しないことです。firebug では、リダイレクトのために 404 エラーとして表示されません。

.htacess ファイル

Options +FollowSymLinks
IndexIgnore */*

# Turn on the RewriteEngine
RewriteEngine On

#  Redirect to index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php

URI を確認して解析すると、404 コントローラーに転送され、要求された URI の 404 ヘッダーが生成されます。ただし、CSS や画像などの埋め込みファイルの場合、要求されたページと同じ応答が表示され、404 エラーは生成されません。

IE で index.php にアクセスすると、index.php は正常に読み込まれますが、すべての無効な css ファイルには index.php と同じヘッダー応答が返されます。

以下は、URI が解析された後にコントローラーをロードするコードです。

    //locate
    $file = 'Lume/' . self::$AppPath . 'Controller/' . self::$ControllerName;
    if(!file_exists($file . '.php')){
        header('HTTP/1.0 404 Not Found');
        $file='Lume/' . self::$AppPath . 'Controller/_404.php';
    }
    //create
    $controller = str_replace('/', '\\', '/' . $file);
    if(!is_subclass_of($controller, '\Lume\Abstracts\Controller'))
        throw new \Exception('Route::Main The controller must extend from Lume\Abstracts\Controller');
    self::$Controller =& new $controller();
4

1 に答える 1

1

リクエストが存在するファイルまたはディレクトリに対するものではない場合、ファイルを読ん.htaccessでいる場合、リクエストを処理するよう求めています。ただし、クエリ文字列を送信したり、データを渡す方法を送信したりしていません。だからあなたはそれを修正する必要があります。そうしている間に、クエリが無効なコントローラーであったかどうかを確認できます (無効なファイルであることが既にわかっています。次に、エラーが発生するはずです。そうすれば、ファイルが見つからない場合とコントローラーが見つからない場合の両方を処理することになります。index.phpheader404

修正するには、他の mvc フレームワークがどのようにそれを行うかを確認できます。

たとえば、codeigniter のように:

RewriteCond $1 !^(index\.php)
RewriteRule ^(.*)$ /index.php/$1 [L]

ここで何が起こるかというと、リクエスト uri に php 変数としてアクセスできます。したがって、リクエストが有効かどうかを確認するために、ブートストラップとも呼ばれるフロントコントローラー内でチェックを実行できます。

于 2012-08-19T17:27:04.170 に答える