CakePHP 2.0中的维护重定向

时间:2013-03-22 00:54:47

标签: php redirect cakephp-2.1 maintenance-mode

我正在尝试为网站创建维护重定向页面,以便可以激活“维护/更新模式”,这将导致将每个页面请求重定向到“向下维护页面”。 我已将开关设置为使用Configure :: write()编写的全局变量,并使用Configure :: read()进行检查。

我遇到的问题是 - 当它处于离线模式时,如何重定向每个页面请求?我的第一个想法是AppController的beforeFilter()函数中的条件$ this-> redirect(...)。但这导致了“重定向循环”错误:

enter image description here

我的第二个想法是,也许(我是CakePHP的新手)这个经常被调用,作为基类控制器的第一个过滤器,这个想法是愚蠢的。我想我可以通过创建一个“MaintenanceFilter”来修复此问题,该“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('*',...),将所有页面重定向到/错误/维护,其中条件服务器状态检查是:

Router::connect('*', array('controller' => 'Errors', 
                        'action' => 'maintenance')); 

我将它放在路由文件的顶部,以便首先处理它。您可能已经猜到,没有页面被重定向到维护页面。

我以为我可以创建自定义异常处理程序并在服务器处于“脱机模式”时抛出异常,但是如何从处理程序的方法体内重定向到维护页面?

我必须缺少关于Cake 2.1的特定内容,或者只是缺少Cake / MVC。有谁看到它可能是什么?

2 个答案:

答案 0 :(得分:2)

你的第一个解决方案,它给你重定向错误,应该没问题 - 你很可能没有检查你是否已经在维护页面上,这意味着当你被重定向到维护页面,与其他每个页面一样,它只是自动重定向到维护页面 - 因此循环。

这是未经测试的代码,但它应该可以使用,或至少让您走上正确的轨道:

function beforeFilter() {

    // Check if we are in offline mode
    if(!empty(Configure::read('offline_mode'))){

        // Check if we are already on the maintenance page
        $firstParam = ($this->request->params['pass'][0]))? $this->request->params['pass'][0]: '';
        if (isset($this->request->controller == 'pages' and $firstParam == 'maintenance')) {
            // Don't do anything - we don't want to redirect again.
        } else {
            // Redirect to the maintenance page
            $this->redirect(array('controller' => 'pages', 'action' => 'display', 'maintenance'));
        }
    }
}

答案 1 :(得分:0)

您可以使用以下过滤器在您的应用中启用维护模式

<强> cakephp-maintenance-mode