一些重写规则,导致404无法正常工作

时间:2012-05-06 18:27:26

标签: php mod-rewrite

我有一个Front控制器执行以下操作:

$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

如果我访问

http://localhost/folder/login

有效:

如果我访问:

http://localhost/folder/ $ $ $ $

它会给我一个真正的404(不是我的自定义:P),而不是将我发送到404页面。这是因为重写规则:

RewriteRule ^([a-z - ] +)$ index.php?p = $ 1 [L],因为它只接受a-z和 -

如果我将其重写为:

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.

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:-2)

问题解决了。使用不同的方法,我用PHP解析了url。