abordagem de “site do ar para manutenção”
Pergunta
Eu tenho usado o Joomla e eu amo a sua instalação administrativa para colocar o site do ar para manutenção. Como já visto, todas as solicitações para o site se ele está em modo de manutenção é encaminhado para uma única página. Se eu quiser adicionar o meu próprio "site do ar para manutenção" módulo para um site não-Joomla, como posso fazer isso? Eu estou usando um framework MVC em PHP chamado Kohana em sua versão 2, que é semelhante com CodeIgniter. Eu tenho uma classe Router onde posso controlar onde um determinado endereço ir. A única abordagem que posso pensar é redirecionar todos os pedidos para a função de controlador específico quando o site está em baixo, mas como posso fazer isso? Não posso voltar a rota manualmente todas as urls certo?
Solução
Kohana 3 :
Você pode definir um catch-all rota em seu bootstrap.php
antes das linhas Kohana::modules()
:
if (/* check if site is in under maintenance mode */) {
Route::set('defaulta', '(<id>)', array('id' => '.*'))
->defaults(array(
'controller' => 'errors',
'action' => 'maintenance',
));
}
Ou você ainda pode mexer com a solicitação para fazer o mesmo:
if (/* check if site is in under maintenance mode */) {
echo Request::factory('errors/maintenance')
->execute()
->send_headers()
->response;
}
Kohana 2 :
Você precisaria estender Controller
e lidar com o 'em manutenção' exibição da página no construtor (mas você precisa ter certeza de todos os controladores de estender esta classe de controlador em vez de um baunilha):
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;
}
}
}
Ou você ainda pode utilizar o sistema de gancho para fazê-lo, adicionando um arquivo na sua pasta hooks
(certifique-se de permitir que os ganchos em sua 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'));
}
}
Como você pode ver, há realmente muitas maneiras como fazer coisas em Kohana porque é um framework PHP muito flexível:)
Outras dicas
Dê uma olhada no encaminhamento documentação . Você deve ser capaz de usar uma expressão regular que redireciona quaisquer uri para um controlador específico / ação. A única questão seria como transformar essa regra on / off.
Você pode verificar uma bandeira de banco de dados em um cabeçalho comum (presumivelmente você tem algum comuns incluem que se conecta ao banco de dados etc), e se o sinalizador está definido, processar uma página e sair particular (certificando-se de fazer todo o usuais coisas de limpeza como fechar conexões de banco de dados, etc).
Você está executando Apache? Adicione isto a seu arquivo .htaccess
em sua raiz web (ou a declaração vhost para o site) para redirecionar todas as solicitações para um "em manutenção" página:
Redirect 301 / /maintenace_page.html
Eu posso pensar de duas idéias para fazer isso acontecer.
-
Como Larry disse, usar expressões regulares para redirecionar todas as solicitações para um local específico. Então, primeiro você determinar se o site estava em modo de manutenção (provavelmente usando uma bandeira banco de dados ou um ambiente arquivo de configuração), em seguida, se fosse, usar o recurso de expressão regular de roteamento para redirecionar todo o tráfego para um só lugar.
-
Você pode verificar se o site estava em modo de manutenção no construtor de cada controlador e redirecionamento conforme necessário. Esta não é provavelmente a solução mais ideal, pois você estaria repetindo o mesmo código para cada controlador. Assim, mesmo que ele iria trabalhar, você provavelmente seria melhor com as expressões regulares.
Routing em Kohana: http://docs.kohanaphp.com/general/routing
PHP expressões regulares: http: //www.php .net / manual / en / reference.pcre.pattern.syntax.php
Controllers em Kohana: http://docs.kohanaphp.com/general/controllers
Em seu index.php definir uma constante chamada IN_MAINTENANCE
Criar um callback como assim em um arquivo gancho :
function in_maintenance()
{
if(IN_MAINTENANCE)
{
Router::$controller = 'my_maintenance_controller';
Router::$method = 'index';
}
}
E adicioná-lo como para o evento system.post_routing.
Event::add('system.post_routing', 'in_maintenance');
Quando você carregar sua mudança de local o valor de IN_MAINENANCE para TRUE e todas as solicitações será redirecionado para sua página de manutenção.
Veja a Evento / documentação gancho para mais informações sobre a criação de um gancho.
Outro método de alternar este é através da verificação de um arquivo:., Se existir, a manutenção está começando de modo a transformar o site off
Se sim, você pode fazer qualquer uma das coisas mencionadas acima.