2009-12-03 15 views
5

Ho utilizzato Joomla e mi piace la sua struttura amministrativa per mettere il sito in manutenzione. Come ho visto, tutte le richieste al sito se è in modalità di manutenzione vengono indirizzate a una singola pagina. Se voglio aggiungere il mio modulo "site down for maintenance" per un sito non Joomla, come posso fare? Sto usando un framework MVC in PHP chiamato Kohana nella sua versione 2 che è simile a Codeigniter. Ho una classe Router in cui posso controllare dove va un determinato indirizzo. L'unico approccio che posso pensare è di reindirizzare ogni richiesta a una particolare funzione del controller quando il sito non è attivo, ma come faccio? Non riesco a reindirizzare manualmente tutti gli URL, giusto?approccio per "sito inattivo per manutenzione"

risposta

6

Kohana 3: È possibile definire un catch-all percorso in bootstrap.php prima delle Kohana::modules() linee:

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

Oppure si può anche pasticciare con la richiesta di fare la stessa cosa:

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

Kohana 2: È necessario estendere Controller e gestire la 'sotto manutenzione visualizzazione della pagina e' nel costruttore (ma è necessario assicurarsi che tutti i controller di estendere questa classe controller invece che la vaniglia uno):

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; 
     } 
    } 
} 

Oppure si può anche utilizzare il sistema di aggancio per farlo, con l'aggiunta di un il file nella cartella hooks (assicuratevi di abilitare i ganci nel vostro 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')); 
    } 
} 

come si può vedere, ci sono in realtà molti modi per fare cose in Kohana perché è un framework PHP molto flessibile :)

2

È possibile controllare un flag di database in un'intestazione comune (presumibilmente si dispone di alcuni elementi comuni che si connettono al database, ecc.) E se il flag è impostato, eseguire il rendering di una particolare pagina ed uscire (assicurandosi di fare tutto le solite cose di pulizia come la chiusura delle connessioni al database, ecc.).

9

Dai un'occhiata al routing documentation. Dovresti essere in grado di usare un'espressione regolare che reindirizza qualsiasi uri a un controller/azione specifico. L'unica domanda rimasta sarebbe come attivare/disattivare questa regola.

+0

Mi piace questa idea. +1 – Abinadi

0

Posso pensare a due idee per farlo accadere.

  1. Come ha detto Larry, utilizzare le espressioni regolari per reindirizzare tutte le richieste in una posizione specifica. Quindi, per prima cosa determineresti se il sito era in modalità manutenzione (probabilmente usando un flag del database o un'impostazione del file di configurazione), quindi se lo fosse, usa la funzione di espressione regolare del routing per reindirizzare tutto il traffico in un posto.

  2. È possibile verificare se il sito era in modalità di manutenzione nel costruttore di ogni controller e reindirizzare se necessario. Questa probabilmente non è la soluzione ottimale dal momento che si ripeterà lo stesso codice per ciascun controller. Quindi, anche se funzionasse, probabilmente staresti meglio con le espressioni regolari.

Routing in Kohana: http://docs.kohanaphp.com/general/routing

PHP espressioni regolari: http://www.php.net/manual/en/reference.pcre.pattern.syntax.php

controller in Kohana: http://docs.kohanaphp.com/general/controllers

1

sono in esecuzione Apache? Aggiungere questo al file .htaccess nella vostra web root (o alla dichiarazione vhost per il sito) per reindirizzare tutte le richieste a una pagina "in manutenzione":

Redirect 301//maintenace_page.html

+0

sarebbe buono ma posso disattivarlo con uno script php se lo desidero? – yretuta

+1

Sicuro. Basta avere uno script PHP edit .htaccess e sostituire 'Redirect 301// maintenace_page.html' con' #Redirect 301// maintenace_page.html' - il '# denota una riga di commento, e il reindirizzamento non verrà eseguito. – leepowers

0

Nel vostro index.php definire una costante chiamata IN_MAINTENANCE

Crea una richiamata in questo modo in un hook file:

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

e aggiungerlo come nell'evento system.post_routing.

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

Quando carichi il tuo sito cambiare il valore di IN_MAINENANCE alle richieste TRUE e tutti verrà reindirizzato alla pagina di manutenzione.

Vedere Event/Hook documentation per ulteriori informazioni sulla creazione di un gancio.

0

Un altro metodo di attivazione è la ricerca di un file: se esiste, la manutenzione è in corso, quindi spegni il sito.

In tal caso, è possibile eseguire una delle operazioni sopra menzionate.

Problemi correlati