1

ウェブサイトのメンテナンスリダイレクトページを作成しようとしています。これにより、「メンテナンス/更新モード」を有効にできます。これにより、すべてのページリクエストが「メンテナンスページのダウン」にリダイレクトされます。Configure :: write()を使用して書き込まれ、Configure :: read()を使用してチェックするグローバル変数にスイッチを設定しました。

私が抱えている問題は、オフラインモードの場合、すべてのページリクエストをリダイレクトするにはどうすればよいですか?私が最初に考えたのは、AppControllerのbeforeFilter()関数の条件付き$ this-> redirect(...)でした。ただし、これにより「リダイレクトループ」エラーが発生しました。

ここに画像の説明を入力してください

私の2番目の考えは、おそらく(CakePHPは初めてですが)これが頻繁に呼び出され、基本クラスのControllerの最初のフィルターであるため、このアイデアはばかげているということでした。リダイレクトのオンラインまたはオフラインのステータスについて同じ変数をチェックする「MaintenanceFilter」を作成することで、これを修正できると思いました。ただし、CookBookにはCake 2.2の新機能であるフィルターが記載されており、このWebサイトでは2.1を使用しています。フィルタは、優先度1(app / Routing / Filterで定義)を指定しても機能しないように見えます。

App::uses('DispatcherFilter', 'Routing');

class MaintenanceFilter extends DispatcherFilter
{
    public function beforeDispatch(CakeEvent $event)
    {
        if (strcmp(Configure::read('ServerStatus'), 'online') == 0)
        {
            $event->stopPropagation();

            $dispatcher = new Dispatcher();

            $dispatcher->dispatch(array('controller' => 'errors', 
                            'action' => 'maintenance'));
        }
    }
}

次に、これをもっと一般的に行うことができ、Router :: connect('*'、...)を使用してルーティング条件を設定すると、すべてのページが/ Errors/maintenanceにリダイレクトされると思いました。条件付きサーバーステータスチェックは次のとおりです。 :

Router::connect('*', array('controller' => 'Errors', 
                        'action' => 'maintenance')); 

これをルーティングファイルの先頭に配置して、最初に処理されるようにしました。ご想像のとおり、メンテナンスページにリダイレクトされるページはありません。

サーバーが「オフラインモード」のときにカスタム例外ハンドラーを作成して例外をスローできると思っていましたが、ハンドラーのメソッド本体内からメンテナンスページにリダイレクトするにはどうすればよいですか?

Cake 2.1に固有の何か、または一般的なCake/MVCだけが欠けているに違いありません。誰かがそれが何であるかわかりますか?

4

2 に答える 2

2

リダイレクトエラーが発生した最初の解決策は問題ないはずです。おそらく、既に[メンテナンス]ページが表示されているかどうかを確認していないため、メンテナンスページにリダイレクトされたときに他のすべてのページと同様に、メンテナンスページに自動的にリダイレクトされるため、ループが発生します。

これはテストされていないコードですが、機能するか、少なくとも正しい方向に進むはずです。

function beforeFilter() {

    // Check if we are in offline mode
    if(!empty(Configure::read('offline_mode'))){

        // Check if we are already on the maintenance page
        $firstParam = ($this->request->params['pass'][0]))? $this->request->params['pass'][0]: '';
        if (isset($this->request->controller == 'pages' and $firstParam == 'maintenance')) {
            // Don't do anything - we don't want to redirect again.
        } else {
            // Redirect to the maintenance page
            $this->redirect(array('controller' => 'pages', 'action' => 'display', 'maintenance'));
        }
    }
}
于 2013-03-22T02:51:51.770 に答える
0

次のフィルターを使用して、アプリでメンテナンスモードを有効にすることができます

cakephp-maintenance-mode

于 2014-02-20T19:54:41.023 に答える