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

问题描述

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

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=$1 [QSA,L]
RewriteRule ^event/([^/]+)/([^/]+)?(/)?$ controller.PHP?page_name=event&event_id=$1 [QSA,L]
RewriteRule ^event-edit/([^/]+)?(/)?$ controller.PHP?page_name=event-edit&event_id=$1 [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=$1 [QSA,L]

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

  • www.example.com/event-submit/

  • www.example.com/about/

  • www.example.com/contact/

因为我制作了一个 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=$1 [QSA,L]

此规则将创建重写循环(500 错误),因为正则表达式 ^([^/]+)?(/)?$ 也将匹配 controller.php(正在写入的 URL)并且您似乎没有任何否则防止这种情况?

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

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

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

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

浏览器只是挂起并需要很长时间,有时页面会加载,但大约需要 5 分钟。

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