Yii Controller Force HTTPS

Я хотел бы знать, как заставить HTTPS (SSL) в действии контроллера Yii.

3 ответа

Решение

Посмотрите на эту статью 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;
    }
}

И даже это для более подробной информации.

Если вы просто хотите применить силу https ко всему вашему приложению, а это то, что мне было нужно, вы можете поместить это в ваш защищенный /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 с родительским контроллером во всех дочерних контроллерах, которые вы создаете. Если вы пропустите один, никакая сила https для этого контроллера. Небольшим недостатком этого является то, что он вызывается после того, как были вызваны фильтры, что означает, что было выполнено больше обработки, чем мы обычно хотим перед перенаправлением.

Если вы нуждаетесь в нем на контроллере от контроллера или от действия к действию, вам нужны фильтры.

Код:

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;
    }
}
Другие вопросы по тегам