2009-12-03 161 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

切換此方法的另一種方法是檢查文件:如果存在,則開始維護,因此請關閉網站。

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