我正在尝试为网站创建维护重定向页面,以便可以激活“维护/更新模式”,这将导致将每个页面请求重定向到“向下维护页面”。 我已将开关设置为使用Configure :: write()编写的全局变量,并使用Configure :: read()进行检查。
我遇到的问题是 - 当它处于离线模式时,如何重定向每个页面请求?我的第一个想法是AppController的beforeFilter()函数中的条件$ this-> redirect(...)。但这导致了“重定向循环”错误:
我的第二个想法是,也许(我是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。有谁看到它可能是什么?
答案 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 强>