質問
私は Joomla を使用していますが、メンテナンスのためにサイトを停止する管理機能が気に入っています。これまで見てきたように、サイトがメンテナンス モードにある場合、サイトへのすべてのリクエストは 1 つのページにルーティングされます。Joomla 以外のサイトに独自の「メンテナンスのためサイトを停止する」モジュールを追加したい場合、どうすればよいですか?私は、Codeigniter と似たバージョン 2 の Kohana と呼ばれる PHP の MVC フレームワークを使用しています。特定のアドレスの宛先を制御できる Router クラスがあります。考えられる唯一のアプローチは、サイトがダウンしているときにすべてのリクエストを特定のコントローラー機能にリダイレクトすることですが、どうすればよいですか?すべての URL を手動で再ルーティングすることは不可能ですよね?
解決
コハナ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;
}
コハナ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 フレームワークであるため、Kohana で何かを行う方法は実際にたくさんあります :)
他のヒント
ルーティングドキュメントのを見てみましょう。あなたは、特定のコントローラ/アクションに任意のURIをリダイレクトする正規表現を使用することができるはずです。残された唯一の問題は、オン/オフそのルールを有効にする方法でしょう。
あなたが共通ヘッダ内のデータベースフラグをチェックすることができ(すべて行うことを確認して、フラグが設定されている場合、特定のページと終了をレンダリング(おそらくあなたは、いくつかの共通のデータベースなどに接続するなどが持っています)データベース接続など)を閉じるなどの通常のクリーンアップ物事ます。
あなたは、Apacheを実行していますか? 「メンテナンス中」ページにすべての要求をリダイレクトする(またはサイトのバーチャルホスト宣言に)Webルートでご.htaccess
ファイルにこれを追加します。
Redirect 301 / /maintenace_page.html
これを実現するには 2 つのアイデアが考えられます。
Larry が言ったように、正規表現を使用してすべてのリクエストを特定の場所にリダイレクトします。したがって、まずサイトがメンテナンス モードかどうかを判断し (おそらくデータベース フラグまたは構成ファイル設定を使用します)、次にメンテナンス モードである場合は、ルーティングの正規表現機能を使用して、すべてのトラフィックを 1 か所にリダイレクトします。
各コントローラーのコンストラクターでサイトがメンテナンス モードであるかどうかを確認し、必要に応じてリダイレクトできます。各コントローラーに対して同じコードを繰り返すことになるため、これはおそらく最適な解決策ではありません。したがって、たとえ機能するとしても、正規表現を使用した方がよいでしょう。
コハナでのルーティング: 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 に変更すると、すべてのリクエストがメンテナンス ページにリダイレクトされます。
を参照してください。 イベント / フックのドキュメント フックの作成の詳細については、「フックの作成」を参照してください。
これをトグルする別の方法は、ファイルをチェックすることです:。それが存在する場合、メンテナンスはとてもサイトをオフに開始されます。
もしそうなら、あなたは上記のもののいずれかを行うことができます。