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

Php 一些重写规则,导致404无法正常工作,php,mod-rewrite,Php,Mod Rewrite,我有一个前端控制器执行以下操作: $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 '40

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

$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页面。这是因为重写规则:

重写规则^([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


如何解决此问题?

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

您的重写规则似乎只查找小写字母和破折号?请阅读整个问题。您可能需要尝试
RewriteRule^([^/]*)$index.PHP?p=$1
,这将排除任何包含/的字符串(因此您的第一个字符串将再次工作)但这将导致其中包含/s的垃圾不会被吞没。我不希望以任何其他方式解决任何问题或/s垃圾。除非所有重写都不匹配,否则不可能将用户指向某个url(404)吗?您的重写规则完全错误。现在,您可能可以通过一些PHP代码来掩盖实际问题,但从长远来看,它最终会让您感到苦恼。否则,您可以选择完全删除您的问题。