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。如果您错过了一个,则该控制器没有 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 回答