我一直在使用Joomla,我喜欢它的管理设施,将网站放下来进行维护。正如我所看到的,如果站点处于维护模式,对站点的所有请求都将路由到单个页面。如果我想为非Joomla网站添加我自己的“网站维护”模块,我该怎么做?我在PHP中使用了一个名为Kohana的MVC框架,其版本2与Codeigniter类似。我有一个Router类,我可以控制某个地址的位置。我能想到的唯一方法是在站点关闭时将每个请求重定向到特定的控制器功能,但是我该怎么做?我不可能手动重新路由所有网址吗?
答案 0 :(得分:9)
查看路由documentation。您应该能够使用将任何uri重定向到特定控制器/操作的正则表达式。剩下的唯一问题是如何打开/关闭该规则。
答案 1 :(得分:6)
Kohana 3 :
您可以在bootstrap.php
行之前的Kohana::modules()
中定义全能路线:
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
并处理构造函数中的“维护下”页面显示(但您需要确保所有控制器都扩展此控制器类而不是vanilla类):
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 :(得分:2)
您可以检查公共标头中的数据库标志(可能是您有一些连接到数据库的常见包含等),如果设置了标志,则渲染特定页面并退出(确保完成所有操作)通常的清理工作,如关闭数据库连接等)。
答案 3 :(得分:1)
你在运行Apache吗?将其添加到Web根目录中的.htaccess
文件(或网站的vhost声明)中,将所有请求重定向到“维护不足”页面:
Redirect 301 / /maintenace_page.html
答案 4 :(得分:0)
我可以想出两个想法来实现这一目标。
像Larry所说,使用正则表达式将所有请求重定向到特定位置。因此,首先您要确定该站点是否处于维护模式(可能使用数据库标志或配置文件设置),如果是,请使用路由的正则表达式功能将所有流量重定向到一个位置。
您可以检查网站是否在每个控制器的构造函数中处于维护模式,并根据需要重定向。这可能不是最佳解决方案,因为您将为每个控制器重复相同的代码。所以,即使它可行,你可能会更好地使用正则表达式。
PHP正则表达式:http://www.php.net/manual/en/reference.pcre.pattern.syntax.php
答案 5 :(得分:0)
在index.php中定义一个名为IN_MAINTENANCE的常量
中创建一个类似的回调函数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。
答案 6 :(得分:0)
另一种切换方法是检查文件:如果存在,则维护正在启动,因此请关闭网站。
如果是这样,你可以做上面提到的任何事情。