3

我正在尝试为所有登录用户强制使用 https。我的大多数应用程序都需要用户登录,但我仍然有许多页面应该只是 http,而其他页面应该通过 http(访客)和 https(登录用户)提供服务,具体取决于登录状态。

我正在使用 Yii 框架,并希望为登录用户的所有页面强制使用 https。用户通过模块进行控制。

这是我当前的 .htaccess

Options +FollowSymLinks

IndexIgnore */*

RewriteEngine on

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.mysite.com/$1 [R=301,L]

#RedirectMatch 301 ^/tk/(.*)$ http://admin.mysite.com/$1
#RewriteRule ([a-z0-9-]+)/? http://$1.mysite.com [R=301,NC,L]

# if a directory or a file exists, use it directly

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# otherwise forward it to index.php

#RewriteRule . index.php
RewriteRule .* index.php [QSA,L]
4

4 回答 4

1

重写规则不是正确的解决方案:它占用了太多资源。

更好的使用:

RedirectPermanent / https://domain.tld

如果可能的话,不要在.htaccess文件中,而是直接在 apache 配置中。

于 2013-02-15T23:28:28.463 回答
1

如果您使用会话或 cookie,则需要检查会话,如果它们有效,则将用户重定向到 https 站点。

这需要在 PHP 中完成。在纯 .htaccess 中无法做到这一点。

于 2013-02-15T21:08:34.987 回答
0

您可以使用过滤器来做到这一点。

Yii CFilter 文档

过滤器类示例:

class CHttpsCheckFilter extends CFilter {

protected function preFilter($filterChain) {
    //place your checking logic here.
    //$filterChain->controller is yor targer controller
    //other useful methods and fields you can find in official documentation.
    if ( !Yii::app()->getRequest()->isSecureConnection ) {            
        $url = 'https://your-new-path';
        Yii::app()->request->redirect($url);
        return false;
    } else
        return true;
}

protected function postFilter($filterChain) {
    return true;   
}

然后,您需要通过filters在其中实现方法将此过滤器附加到您的控制器:

public function filters()
{
    return array(
        'accessControl', // perform access control for CRUD operations
        array(
            'CHttpsCheckFilter',
        ),
    );
}

这是基本功能。您可以向过滤器添加额外的逻辑,它可以检查您的自定义方法的目标控制器是否有其他规则......或者它可能包含所有安全规则。

于 2013-02-16T17:53:15.737 回答
0

如果您使用session为您的会话命名的 cookie,您可以使用 RewriteCond 来测试您的会话 cookie

RewriteCond %{HTTP_COOKIE} session
RewriteRule .* https://www.mysite.com/$0 [R,L]
于 2013-02-15T23:24:04.933 回答