.htaccess前端控制器mod重写麻烦

时间:2011-04-18 15:30:18

标签: .htaccess mod-rewrite front-controller

我知道这应该很简单,但我很难为我的前端控制器编写.htaccess规则。

/ themes /文件夹包含我所有的css / js / images等所以我不希望它们通过我的控制器

.htaccess文件位于/ myadminarea /文件夹的根目录中。

网站的根目录('/'上的'/ myadminarea'下方没有.htacess文件)

在前端控制器内部,我查看URL,然后直接包含文件 - 但是我想对我接受的Urls非常原谅..

如果网址是针对特定文件的,我希望它通过前端控制器

如果url用于目录(尾随斜杠),我想假设他们在该文件夹中寻找index.php

以下规则适用于此类网址

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

但是会落在这样的网址上 -

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

包含文件名(它不使用前端控制器,只是直接加载文件) - 我知道!-f排除了文件的重写规则,但我已经尝试了我能想到的每一个组合以下至少适用于没有文件名的网址。当我尝试路由每个请求(除了那些到themes文件夹)我得到一个服务器配置错误(500)

这是我的规则

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

编辑:

添加了Condensed前端控制器

// 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;
    }
}

1 个答案:

答案 0 :(得分:1)

我的重写规则中的主要斜线是杀了我......

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

不是

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