2012-10-22 14 views

Odpowiedz

7

Spójrz na ten artykuł 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; 
    } 
} 

I nawet this więcej szczegółów.

+0

Mam problem, że po HTTPS cała moja witryna pozostaje HTTPS. Czy uważasz, że dobrze jest stworzyć HttpFilter? –

+0

Powiedziałeś, że musisz wymusić HTTPS. Moje rozwiązanie działa. Czy musisz wymuszać HTTPS tylko dla określonych działań kontrolera? –

+0

Tylko dla kontrolera UserController i innych kontrolerów powinno być http. Kiedy jestem w HTTPS wszystkie strony pozostają https. –

0

Kod:

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

Jeśli tylko chcesz zastosować https wymusić na swojej całej aplikacji, który jest to, co potrzebne, można umieścić to w swoim chronionych/podzespołów/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; 
    } 
    } 

To jest bardziej przejrzyste rozwiązanie niż filtry, jeśli potrzebujesz https w całym serwisie, ponieważ przy filtrach musisz zastosować array_merge z kontrolerem nadrzędnym we wszystkich tworzonych kontrolerach podrzędnych. Jeśli przegapisz jedną, żadna siła https dla tego kontrolera. Niewielką wadą tego jest to, że jest wywoływana po wywołaniu filtrów, co oznacza, że ​​wykonano więcej przetwarzania niż zwykle chcemy przed przekierowaniem.

Jeśli potrzebujesz tego na kontrolerze według kontrolera lub akcji według działania, filtry są tym, czego szukasz.