Yii Управление URL HTTPS
Я использую код для разделения страниц, который HTTPS и HTTP на моем сайте
Проблема в том, что когда я нахожусь на HTTP, ссылки на HTTPS не имеют WWW и наоборот. Я не нашел проблему в сценарии.
public function createUrl($route, $params = array(), $ampersand = '&')
{
$url = parent::createUrl($route, $params, $ampersand);
// If already an absolute URL, return it directly
if (strpos($url, 'http') === 0) {
return $url;
}
// Check if the current protocol matches the expected protocol of the route
// If not, prefix the generated URL with the correct host info.
$secureRoute = $this->isSecureRoute($route);
if (Yii::app()->request->isSecureConnection) {
return $secureRoute ? $url : 'http://' . Yii::app()->request->serverName . $url;
} else {
return $secureRoute ? 'https://' . Yii::app()->request->serverName . $url : $url;
}
}
public function parseUrl($request)
{
$route = parent::parseUrl($request);
// Perform a 301 redirection if the current protocol
// does not match the expected protocol
$secureRoute = $this->isSecureRoute($route);
$sslRequest = $request->isSecureConnection;
if ($secureRoute !== $sslRequest) {
$hostInfo = $secureRoute ? 'https://' . Yii::app()->request->serverName : 'http://' . Yii::app()->request->serverName;
if ((strpos($hostInfo, 'https') === 0) xor $sslRequest) {
$request->redirect($hostInfo . $request->url, true, 301);
}
}
return $route;
}
private $_secureMap;
/**
* @param string the URL route to be checked
* @return boolean if the give route should be serviced in SSL mode
*/
protected function isSecureRoute($route)
{
if ($this->_secureMap === null) {
foreach ($this->secureRoutes as $r) {
$this->_secureMap[strtolower($r)] = true;
}
}
$route = strtolower($route);
if (isset($this->_secureMap[$route])) {
return true;
} else {
return ($pos = strpos($route, '/')) !== false
&& isset($this->_secureMap[substr($route, 0, $pos)]);
}
}
}
Код адаптирован с: http://www.yiiframework.com/wiki/407/url-management-for-websites-with-secure-and-nonsecure-pages/
1 ответ
Лучше управлять этим на уровне контроллера, используя фильтры.
В вашем каталоге компонентов настройки 2 фильтра HttpsFilter
а также HttpFilter
следующее:-
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;
}
}
а также
class HttpFilter extends CFilter {
protected function preFilter( $filterChain ) {
if ( Yii::app()->getRequest()->isSecureConnection ) {
# Redirect to the secure version of the page.
$url = 'http://' .
Yii::app()->getRequest()->serverName .
Yii::app()->getRequest()->requestUri;
Yii::app()->request->redirect($url);
return false;
}
return true;
}
}
затем в каждом контроллере принудительно используем https с помощью фильтров, необязательно по действию:
class SiteController extends Controller {
public function filters()
{
return array(
'https +index', // Force https, but only on login page
);
}
}
Изменить: если filters()
функция выше, кажется, не работает для вас, вместо этого попробуйте
return array(
array('HttpsFilter +index'), // Force https, but only on login page
);
См. http://www.yiiframework.com/doc/guide/1.1/en/basics.controller (и комментарии к нему).