我有一个前端控制器执行以下操作:
$pages = array('home', 'login', 'create-account', 'activate');
$page = ((empty($_GET['p'])) ? 'home' : $_GET['p']);
if (in_array($page, $pages) && file_exists($page . '.php'))
include $page . '.php';
else
include '404.php';
然后我有这个mod_rewrite
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-z-]+)$ index.php?p=$1 [L]
RewriteRule ^(activate)/([\w-]+)$ index.php?p=$1&f=$2
如果我访问
有用:
如果我访问:
它会给我一个真正的 404(不是我的自定义 :P),而不是把我送到 404 页面。这是因为重写规则:
RewriteRule ^([az-]+)$ index.php?p=$1 [L] 因为它只接受 az 和 -
如果我将其重写为:
RewriteRule ^(.*)$ index.php?p=$1 [L]
它可以工作并发送到 404,但是这种重写不起作用:
RewriteRule ^(activate)/([\w-]+)$ index.php?p=$1&f=$2
由于第一个将匹配。
如果我尝试改变位置:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(activate)/([\w-]+)$ index.php?p=$1&f=$2 [L]
RewriteRule ^(.*)$ index.php?p=$1 [L]
我在所有页面上都收到 404。
我该如何解决这个问题?