如何解决.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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。