我想知道如何在Yii Controller Action强制使用HTTPS(SSL)。
答案 0 :(得分: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了解详情。
答案 1 :(得分: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强制。这个的一个小缺点就是在调用过滤器之后调用它,这意味着在重定向之前已经完成了比我们通常想要的更多的处理。
如果您需要通过控制器在控制器上执行此操作或按操作行动,则过滤器就是您所需要的。
答案 2 :(得分: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;
}
}