2009-12-03 68 views
5

我一直在使用Joomla,我喜欢它的管理设施,把网站的维护。正如我所看到的,如果网站处于维护模式,对网站的所有请求都会路由到单个页面。如果我想为非Joomla网站添加我自己的“维护站点”模块,我该怎么做?我在PHP中使用名为Kohana的MVC框架,其版本2与Codeigniter类似。我有一个路由器类,我可以控制某个地址去哪里。我能想到的唯一方法是在站点关闭时将每个请求重定向到特定的控制器功能,但我该怎么做?我无法手动重新路由所有的URL?方法为“站点维护”

回答

6

的Kohana 3: 您可以Kohana::modules()行之前定义你的bootstrap.php一个包罗万象的路线:

if (/* check if site is in under maintenance mode */) { 
    Route::set('defaulta', '(<id>)', array('id' => '.*')) 
     ->defaults(array(
      'controller' => 'errors', 
      'action'  => 'maintenance', 
     )); 
} 

或者你甚至可以惹的要求做同样的:

if (/* check if site is in under maintenance mode */) { 
    echo Request::factory('errors/maintenance') 
     ->execute() 
     ->send_headers() 
     ->response; 
} 

Kohana 2: 您需要延长Controller并处理'under maintenanc E”在构造页面显示(但你需要确保所有的控制器的香草之一,而不是扩展这个控制器类):通过添加

abstract class Custom_Controller extends Controller { 

    public function __construct() 
    { 
     parent::__construct(); 
     if (/* check if site is in under maintenance mode */) { 
      $page = new View('maintenance'); 
      $page->render(TRUE); 
      exit; 
     } 
    } 
} 

或者你甚至可以利用钩系统做到这一点,文件在您hooks文件夹(请确保您启用钩子钩住你的config.php):

Event::add('system.ready', 'check_maintenance_mode'); 

function check_maintenance_mode() { 
    if (/* check if site is in under maintenance mode */) { 
     Kohana::config_set('routes', array('_default' => 'errors/maintenance')); 
    } 
} 

正如你所看到的,其实有很多方法如何做的东西在Kohana的,因为它是一个非常灵活的PHP框架:)

2

你可以在一个通用头文件中检查一个数据库标志(大概你有一些常用的包含连接数据库的东西等等),并且如果该标志被设置,则渲染一个特定的页面并退出(确保全部完成通常的清理工作就像关闭数据库连接等)。

9

看看路由documentation。您应该能够使用正则表达式将任何uri重定向到特定的控制器/操作。剩下的唯一问题就是如何打开/关闭该规则。

+0

我喜欢这个想法。 +1 – Abinadi 2009-12-03 06:43:19

0

我可以想出两个想法来实现这一点。

  1. 像拉里说的那样,使用正则表达式将所有请求重定向到特定位置。因此,首先确定站点是否处于维护模式(可能使用数据库标志或配置文件设置),如果是,则使用路由的正则表达式功能将所有流量重定向到一个位置。

  2. 您可以检查网站是否处于维护模式,在每个控制器的构造函数中并根据需要重定向。这可能不是最优化的解决方案,因为您将为每个控制器重复相同的代码。所以,即使它能起作用,用正则表达式也许会更好。

路由中的Kohana:http://docs.kohanaphp.com/general/routing

PHP正则表达式:http://www.php.net/manual/en/reference.pcre.pattern.syntax.php

控制器中的Kohana:http://docs.kohanaphp.com/general/controllers

1

你运行的是Apache?在Web根目录添加到您的.htaccess文件(或虚拟主机声明的网站)重定向所有请求到“正在维护”页面:

Redirect 301//maintenace_page.html

+0

这将是很好,但我可以关闭一个PHP脚本,如果我想? – yretuta 2009-12-03 08:08:45

+1

当然。只需要一个PHP脚本编辑.htaccess,并用'#Redirect 301 ///maintenace_page.html'替换'Redirect 301 // maintenace_page.html','#'表示注释行,重定向将不会执行。 – leepowers 2009-12-03 08:25:46

0

在你的index.php定义一个名为恒IN_MAINTENANCE

hook file创建像这样的回调:

function in_maintenance() 
{ 
    if(IN_MAINTENANCE) 
    { 
     Router::$controller = 'my_maintenance_controller'; 
     Router::$method = 'index'; 
    } 
} 

并将其添加为到system.post_routing事件。

Event::add('system.post_routing', 'in_maintenance'); 

当您上传您的网站改变IN_MAINENANCE的为TRUE,并且所有请求的值将被重定向到维护页面。

有关创建挂钩的更多信息,请参阅Event/Hook documentation

0

切换此方法的另一种方法是检查文件:如果存在,则开始维护,因此请关闭网站。

如果是这样,你可以做任何上述的事情。