2012-10-22 36 views

回答

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; 
    } 
} 

而對於更多的細節,甚至this看看。

+0

我有問題,HTTPS後,我的所有網站保持HTTPS。你認爲創建HttpFilter很好嗎? –

+0

你說你需要強制HTTPS ..我的解決方案。您是否需要僅對某些控制器操作強制使用HTTPS? –

+0

只有UserController和其他控制器應該是http。當HTTPS中的所有頁面都保持爲https時。 –

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; 
    } 
} 
1

如果你只是想申請強制HTTPS到你的整個應用程序,這正是我需要的,你可以把這個在你的保護/組件/ 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的強制。這個小缺點是它在調用過濾器之後被調用,這意味着已經完成了比我們通常在重定向之前更多的處理。

如果您需要控制器上的控制器或行動的基礎,過濾器就是您要找的。