我想知道如何在 Yii Controller Action 中强制使用 HTTPS (SSL)。
问问题
6297 次
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 回答