【发布时间】:2013-03-22 00:54:46
【问题描述】:
我正在尝试为网站制作维护重定向页面,以便可以激活“维护/更新模式”,这将导致将每个页面请求重定向到“维护页面关闭”。 我已将开关设置为使用 Configure::write() 编写并使用 Configure::read() 检查的全局变量。
我遇到的问题是——当它处于离线模式时,我如何重定向每个页面请求?我的第一个想法是 AppController 的 beforeFilter() 函数中的条件 $this->redirect(...) 。但这导致了“重定向循环”错误:
我的第二个想法是,也许(我是 CakePHP 的新手)它被如此频繁地调用,作为基类 Controller 的第一个过滤器,这个想法很愚蠢。我想我可以通过创建一个“MaintenanceFilter”来解决这个问题,该过滤器检查相同变量的在线或离线状态以进行重定向。然而,CookBook 提到过滤器是 Cake 2.2 的新功能,而本网站使用的是 2.1。过滤器似乎也不起作用,即使我给它优先级 1。(在 app/Routing/Filter 中定义)。
App::uses('DispatcherFilter', 'Routing');
class MaintenanceFilter extends DispatcherFilter
{
public function beforeDispatch(CakeEvent $event)
{
if (strcmp(Configure::read('ServerStatus'), 'online') == 0)
{
$event->stopPropagation();
$dispatcher = new Dispatcher();
$dispatcher->dispatch(array('controller' => 'errors',
'action' => 'maintenance'));
}
}
}
然后我想也许我可以更一般地执行此操作,并使用 Router::connect('*', ...) 设置路由条件,将所有页面重定向到 /Errors/maintenance,其中条件服务器状态检查是:
Router::connect('*', array('controller' => 'Errors',
'action' => 'maintenance'));
我将它放在路由文件的顶部,以便首先处理它。您可能已经猜到了,没有任何页面被重定向到维护页面。
我在想我可以创建一个自定义异常处理程序并在服务器处于“离线模式”时抛出一个异常,但是我将如何从处理程序的方法体中重定向到维护页面?
我一定是遗漏了一些关于 Cake 2.1 的特定内容,或者只是一般的 Cake/MVC。有人知道它可能是什么吗?
【问题讨论】:
标签: php redirect cakephp-2.1 maintenance-mode