我一直在使用 Joomla,我喜欢它的管理设施,可以让网站停止维护。正如我所看到的,如果站点处于维护模式,则对站点的所有请求都将路由到单个页面。如果我想为非 Joomla 站点添加我自己的“站点停机维护”模块,我该怎么做?我在 PHP 中使用了一个名为 Kohana 的 MVC 框架,其版本 2 与 Codeigniter 类似。我有一个路由器类,我可以控制某个地址的去向。我能想到的唯一方法是在站点关闭时将每个请求重定向到特定的控制器功能,但我该怎么做呢?我不可能手动重新路由所有网址,对吗?
7 回答
看看路由文档。您应该能够使用将任何 uri 重定向到特定控制器/操作的正则表达式。剩下的唯一问题是如何打开/关闭该规则。
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
在构造函数中扩展和处理“维护中”页面显示(但您需要确保所有控制器都扩展此控制器类而不是普通控制器类):
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 框架 :)
您可以检查公共标头中的数据库标志(假设您有一些连接到数据库的公共包含等),如果设置了标志,则呈现特定页面并退出(确保执行所有通常的清理工作比如关闭数据库连接等)。
你在运行 Apache 吗?将此添加到您.htaccess
的 Web 根目录(或站点的 vhost 声明)中的文件中,以将所有请求重定向到“维护中”页面:
Redirect 301 / /maintenace_page.html
我可以想到两个想法来实现这一点。
就像拉里所说,使用正则表达式将所有请求重定向到特定位置。因此,首先您将确定站点是否处于维护模式(可能使用数据库标志或配置文件设置),然后如果是,则使用路由的正则表达式功能将所有流量重定向到一个地方。
您可以在每个控制器的构造函数中检查站点是否处于维护模式,并根据需要进行重定向。这可能不是最佳解决方案,因为您将为每个控制器重复相同的代码。所以,即使它可以工作,你可能会更好地使用正则表达式。
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
在您的 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,所有请求都将被重定向到您的维护页面。
另一种切换方法是检查文件:如果存在,则维护开始,因此关闭站点。
如果是这样,您可以执行上述任何操作。