0

これは簡単なはずですが、フロントコントローラーの .htaccess ルールを書くのに苦労しています。

/themes/ フォルダーにはすべての css/js/images などが含まれているため、コントローラーを通過させたくない

.htaccess ファイルは、/myadminarea/ フォルダーのルートにあります。

サイトのルート (「/」の「/myadminarea」の下には .htacess ファイルがありません)

フロント コントローラー内で URL を確認し、ファイルを直接インクルードします。

URLが特定のファイルの場合、フロントコントローラーを通過させたい

URLがディレクトリ(末尾のスラッシュ)の場合、そのフォルダー内でindex.phpを探していると想定したい

以下のルールは、このような URL に対して機能します

mydomain.com/myadminarea/mysection/action/ 
(loads mydomain.com/myadminarea/mysection/action/index.php via the front controller)

しかし、このようなURLに落ちます-

mydomain.com/myadminarea/mysection/action/index.php

ファイル名を含む(フロントコントローラーを使用せず、ファイルを直接ロードするだけです)- !-f がファイルの書き換えルールを除外することは知っていますが、考えられるすべての組み合わせと以下を試しましたファイル名のない URL では少なくとも機能します。すべてのリクエストをルーティングしようとすると (テーマ フォルダーへのリクエストを除く)、サーバー構成エラー (500) が発生します。

これが私のルールです

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^(themes)/ /myadminarea/index.php [NC,L]

編集:

凝縮されたフロントコントローラーを追加

// what page is actually being requested?
$uri = explode("/", $_SERVER["REQUEST_URI"]);
//lose the first element and add index.php the last one if it is blank
array_shift($uri);
if (end($uri) == ''){
    array_pop($uri);
    $uri[] = 'index.php';
}

$page_requested = implode('/', $uri);
if ($page_requested == 'myadminarea/index.php'){
    $page_requested = false;
}

includePage($page_requested);

function includePage($page_requested){
    if ($page_requested && file_exists(BASE_FILE_PATH . $page_requested) && is_file(BASE_FILE_PATH . $page_requested)){
        include(BASE_FILE_PATH . $page_requested);
    } else {
        echo $page_requested;
    }
}
4

1 に答える 1

1

私の書き換えルールの先頭のスラッシュは私を殺していました...

RewriteRule !^themes/* myadminarea/index.php [L,QSA]

いいえ

RewriteRule !^themes/* /myadminarea/index.php [L,QSA]
于 2011-04-18T22:24:05.163 に答える