「メンテナンスのためサイトを停止する」場合のアプローチ

StackOverflow https://stackoverflow.com/questions/1838019

  •  11-09-2019
  •  | 
  •  

質問

私は 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 つのアイデアが考えられます。

  1. Larry が言ったように、正規表現を使用してすべてのリクエストを特定の場所にリダイレクトします。したがって、まずサイトがメンテナンス モードかどうかを判断し (おそらくデータベース フラグまたは構成ファイル設定を使用します)、次にメンテナンス モードである場合は、ルーティングの正規表現機能を使用して、すべてのトラフィックを 1 か所にリダイレクトします。

  2. 各コントローラーのコンストラクターでサイトがメンテナンス モードであるかどうかを確認し、必要に応じてリダイレクトできます。各コントローラーに対して同じコードを繰り返すことになるため、これはおそらく最適な解決策ではありません。したがって、たとえ機能するとしても、正規表現を使用した方がよいでしょう。

コハナでのルーティング: 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 に変更すると、すべてのリクエストがメンテナンス ページにリダイレクトされます。

を参照してください。 イベント / フックのドキュメント フックの作成の詳細については、「フックの作成」を参照してください。

これをトグルする別の方法は、ファイルをチェックすることです:。それが存在する場合、メンテナンスはとてもサイトをオフに開始されます。

もしそうなら、あなたは上記のもののいずれかを行うことができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top