1

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

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

在此处输入图像描述

我的第二个想法是,也许(我是 CakePHP 的新手)这经常被调用,作为基类 Controller 的第一个过滤器,这个想法很愚蠢。我想我可以通过创建一个“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('*', ...) 设置路由条件,将所有页面重定向到 /Errors/maintenance,条件服务器状态检查是:

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

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

我在想我可以制作一个自定义异常处理程序并在服务器处于“离线模式”时引发异常,但是我将如何从处理程序的方法体内重定向到维护页面?

我必须遗漏一些关于 Cake 2.1 的特定内容,或者只是一般的 Cake/MVC。有人看到它可能是什么吗?

4

2 回答 2

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'));
        }
    }
}
于 2013-03-22T02:51:51.770 回答
0

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

cakephp-维护模式

于 2014-02-20T19:54:41.023 回答