【问题标题】:Maintenance Redirect in CakePHP 2.0CakePHP 2.0 中的维护重定向
【发布时间】: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


    【解决方案1】:

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

    这是未经测试的代码,但它应该可以工作,或者至少让你走上正轨:

    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'));
            }
        }
    }
    

    【讨论】:

    • 不错的收获!你完全正确;一旦我将当前页面的检查添加为维护页面,它就可以顺利运行。非常感谢!
    【解决方案2】:

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

    cakephp-maintenance-mode

    【讨论】:

    • 更清洁,我同意。也可以:使用基本的 lib 类,请参阅 moving-a-cakephp-app。
    • 新人知道这存在否则不会创建
    • 它总是以非常基本的状态存在;) 最近刚刚为 Cake3 添加了使用 Dispatcher 过滤器。拥有多个 repo 也没有什么坏处 :) 通常有不同的实施细节。所以一切都很好。
    猜你喜欢
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    相关资源
    最近更新 更多