1

特定のコントローラーに SSL を強制し、それ以外のすべての SSL を削除したいと考えています。少し前に、カスタム Controller クラスの _init() にスニペットがありましたが、期待どおりに機能しませんでした。

$ssl = $this->request->is('ssl');

$forceSecured = in_array($this->request->controller, array('Orders', 'Customers'));

//remove SSL for non-ssl pages
if ($ssl && !$forceSecured) {
    return $this->redirect(Router::match(
                    $this->request->params,
                    $this->request,
                    array('absolute' => true, 'scheme' => 'http://')
            )
    );
}

// Force ssl on for ssl pages
if (!$ssl && $forceSecured) {
    return $this->redirect(Router::match(
                    $this->request->params,
                    $this->request,
                    array('absolute' => true, 'scheme' => 'https://')
            )
    );
}

私はレガシー アプリケーションをサポートしているので、複数のハードコードされたルートが定義されています。Router::connect でハンドラーを使用できると確信していますが、すべての要求をチェックしたいと思います。継続ルートはここに行く方法でしょうか?

4

2 に答える 2

3

Response2 つのこと: (1)オブジェクトを返すことはできません_init()(返されるものredirect()です)。(2) 微妙な設計上の問題があります。次のようにすることをお勧めします。

protected $_secure = false;

public function __invoke($request, $params, array $options = array()) {
    if (!$this->_secure && !$request->is('ssl')) {
        return parent::__invoke($request, $params, $options);
    }
    return $this->redirect(Router::match($request->url, $request, [
        'absolute' => true, 'scheme' => 'https://'
    ]));
}

所見:

  • 同じ URL にリダイレクトしていますが、プロトコルの場合、URL を冗長に生成しても意味がありません
  • 特定のコントローラーがリダイレクトされるかどうかの決定は、コントローラーと共にあります。これは、コントローラーごとではなくアクションごとのポイントに到達するにつれて (おそらくポイントに到達する可能性があります)、より重要になります。
于 2012-10-29T12:29:37.180 に答える
0

なぜアプリケーションに到達させるのですか?特定のルートを取得して ssl を強制する場合は、htaccess 書き換えを使用します。

Ssl は送信プロトコルの詳細であり、サイト コードとは関係ありません。これらの詳細は apache (または nginx) に処理させてください。物事を処理する最善の方法への責任の分離。

キャッチしたい正確なURLを提供する場合、誰かが書き換え条件ロジックを手伝ってくれると確信しています

于 2012-10-29T02:34:46.430 に答える