8

Yii Controller Action で HTTPS (SSL) を強制する方法を知りたいです。

4

3 に答える 3

7

この記事を見てみましょうhttp://www.yiiframework.com/forum/index.php/topic/25407-forcing-https-in-yii/

class HttpsFilter extends CFilter {
    protected function preFilter( $filterChain ) {
        if ( !Yii::app()->getRequest()->isSecureConnection ) {
            # Redirect to the secure version of the page.
            $url = 'https://' .
                Yii::app()->getRequest()->serverName .
                Yii::app()->getRequest()->requestUri;
                Yii::app()->request->redirect($url);
            return false;
        }
        return true;
    }
}

さらに詳細については、これを参照してください。

于 2012-10-22T10:59:54.947 に答える
1

私が必要としていたアプリケーション全体に https 強制を適用したいだけの場合は、これを protected/components/Controller.php に入れることができます。

  public function beforeAction($action) {
    if( ! Yii::app()->getRequest()->isSecureConnection ) {
      $url = 'https://' . 
        Yii::app()->getRequest()->serverName . 
        Yii::app()->getRequest()->requestUri;
      Yii::app()->request->redirect($url);
      return false;
    }
  }

サイト全体の https が必要な場合、これはフィルターよりもクリーンなソリューションです。フィルターを使用すると、作成するすべての子コントローラーの親コントローラーで array_merge を適用する必要があるためです。1 つでも見逃した場合、そのコントローラーの https 強制はありません。これの小さな欠点は、フィルターが呼び出された後に呼び出されることです。つまり、リダイレクトの前に、通常よりも多くの処理が行われます。

コントローラーごと、またはアクションごとに必要な場合は、フィルターが必要です。

于 2014-05-22T21:22:19.577 に答える
0

コード:

private static $secureRoutes = array('site/login'=>'',);

public function filterAccessControl($filterChain)   {

    if(!Yii::app()->getRequest()->isSecureConnection && array_key_exists($filterChain->controller->route, self::$secureRoutes)){
            $this->redirect($this->createAbsoluteUrl($filterChain->controller->route, array(), 'https'));
        return false;
    }
    else if(Yii::app()->getRequest()->isSecureConnection && !array_key_exists($filterChain->controller->route, self::$secureRoutes)){
            $this->redirect($this->createAbsoluteUrl($filterChain->controller->route, array(), 'http'));
        return false;
    }
}
于 2013-05-28T06:38:58.967 に答える