.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 除了页面名称之外没有任何内容的内容,例如:
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= [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)
我正在建立一个活动网站,在我的所有网站中我都执行以下逻辑:
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 除了页面名称之外没有任何内容的内容,例如:
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= [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)