.htaccess 重写规则以错误的方式运行

.htaccess rewrite rules behaving in a wrong way

我正在建立一个活动网站,在我的所有网站中我都执行以下逻辑:

RewriteEngine On
Options +FollowSymLinks

RewriteBase /
RewriteRule ^new/event?(/)?$ controller.php?page_name=new-event [QSA,L]
RewriteRule ^get-event/([^/]+)?(/)?$ controller.php?page_name=get-event&event_id= [QSA,L]
RewriteRule ^event/([^/]+)/([^/]+)?(/)?$ controller.php?page_name=event&event_id= [QSA,L]
RewriteRule ^event-edit/([^/]+)?(/)?$ controller.php?page_name=event-edit&event_id= [QSA,L]

// this below line to handle all links that do not apply to the above rules, is this wrong?
RewriteRule ^([^/]+)?(/)?$ controller.php?page_name= [QSA,L]

最后一行是处理所有 URL 除了页面名称之外没有任何内容的内容,例如:

因为我制作了一个 controller.php 文件,它根据 page_name 值处理所有请求。

但这不适用于这个新网站,这是我得到的:

当我请求属于该站点的任何 URL 时,浏览器只是挂起并一直等待,有时页面会加载,但大约 5 分钟后。

我不知道为什么! (它适用于我的所有其他网站!)

我做错了什么吗?我已经搜索了很多,但没有任何效果。

编辑

这是 controller.php:(它只是检查 page_name 是否允许,然后包含它)

<?php
session_start();
define('__SITE_ROOT__', dirname(__FILE__));
define('__HELPERS__', __SITE_ROOT__ . '/' . 'helpers');
define('__APP__', __SITE_ROOT__ . '/' . 'app');

$page_name = strip_tags($_GET['page_name']);

$allowed_pages = array(
    'index',
    'about',
    'contact',
    'new-event',
    'event-edit',
    'get-event',,
    '404'
);
class Controller{
    public $page_name = 'index';
    public $allowed_names = array();
}
$controller = new Controller();
$controller->allowed_names = $allowed_pages;
$controller->page_name = $page_name;
if(in_array($controller->page_name, $controller->allowed_names))
{
    $page_real_name = $controller->page_name . ".php";

}else{
    $page_real_name = "404.php";
}
include(__APP__  . '/' . $page_real_name);
// this below line to handle all links that do not apply to the above rules, is this wrong?
RewriteRule ^([^/]+)?(/)?$ controller.php?page_name= [QSA,L]

这条规则会创建一个重写循环(500 错误),因为正则表达式 ^([^/]+)?(/)?$ 也会匹配 controller.php(正在写入的 URL)而你不似乎有什么东西可以防止这种情况发生?

您可以通过在字符 class 中添加一个点来解决此问题,这样它就不会匹配 .php 中的点。例如:

RewriteRule ^([^/.]+)?/?$ controller.php?page_name= [QSA,L]

您不需要将最后一个 / 括在括号中。

(我假设 // 评论 只是在你的问题中,因为这在语法上是无效的。评论用 # 分隔。)

the browser just hangs and takes forever, sometimes the page loads but after like 5 minutes.

但是,以上并不能完全解释这种行为,除非 LimitInternalRecursion 在您的服务器配置中设置得非常高?! (默认为 10)