yii 框架 – 安全站点和非安全站点的 URL 管理

在本文中我将描述怎么管理安全站点和非安全站点的 URL 管理。

安全站点的内容使用httpsSSL (安全套接字层) 协议发送,而非安全站点使用http协议。为了描述简单,我们称前者https内容/页,后者 ‘http‘ 内容/页。一个严格要求的网站通常需要一些页面使用https,一些页面使用http。例如,为了防止密码嗅探,我们的登录页面使用https,而为了减轻服务器压力,对于不敏感的页面(例如,主页)我们使用http。

当我们在https页面是我们会需要生成http页面 URL,反之亦然。例如,一个站点有一个所有页面都使用的主菜单,主菜单中包含有,https(例如;登录页) 和http(例如:关于页) 的链接。如果我们在一个http页面,我们可以直接链接到其他http页面(例如: /about),但是我们不得不使用绝对URL地址使用https协议链接到其他https页面。同上如果我们在https页面,我们也会遇到类似的情况。

另一种情况是我们使用http协议请求也安全页面,我们应当将浏览器重定向到使用https协议,反之亦然。重定义通常为 301 永久重定向。这可能使用 web 服务器的重写规则实现。但是如果我们要细化安全和非安全的页面,重写规则可能会变得非常复杂。

为了实现上面的两个需求,我们可以继承 CUrlManager, 如下

class UrlManager extends CUrlManager
{
    /**
     * @var string 非SSL模式下的主机信息
     */
    public $hostInfo = ‘http://localhost‘;
    /**
     * @var string SSL模式下的主机信息
     */
    public $secureHostInfo = ‘https://localhost‘;
    /**
     * @var array 只在 SSL 模式下可用的路由列表.
     * 数组的每一项既可以是一个 URL 路由(例,‘site/create‘)
     * 也可以是控制器 ID (例,‘settings‘).后者表示该控制器所有动作都为安全页
     */
    public $secureRoutes = array();

    public function createUrl($route, $params = array(), $ampersand = ‘&‘)
    {
        $url = parent::createUrl($route, $params, $ampersand);

        // 如果已经为 绝对 URL 直接返回
        if (strpos($url, ‘http‘) === 0) {
            return $url;
        }

        // 检查当前协议是否是预期的协议
        // 如果不是则需要在生成 URL 时使用正确的主机信息
        $secureRoute = $this->isSecureRoute($route);
        if (Yii::app()->request->isSecureConnection) {
            return $secureRoute ? $url : $this->hostInfo . $url;
        } else {
            return $secureRoute ? $this->secureHostInfo . $url : $url;
        }
    }

    public function parseUrl($request)
    {
        $route = parent::parseUrl($request);

        // 如果当前协议不符合预期协议,执行 301 重定向
        $secureRoute = $this->isSecureRoute($route);
        $sslRequest = $request->isSecureConnection;
        if ($secureRoute !== $sslRequest) {
            $hostInfo = $secureRoute ? $this->secureHostInfo : $this->hostInfo;
            if ((strpos($hostInfo, ‘https‘) === 0) xor $sslRequest) {
                $request->redirect($hostInfo . $request->url, true, 301);
            }
        }
        return $route;
    }

    private $_secureMap;

    /**
     * @param string 需要检查的 URL 路由
     * @return boolean 给出的 URL 路由是否应该在 SSL 模式下
     */
    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)]);
        }
    }
}

现在,在应用程序的配置,我们应当使用我们的 URL 管理器来取代默认。

return array(
    // ....
    ‘components‘ => array(
        ‘urlManager‘ => array(
            ‘class‘ => ‘UrlManager‘,
            ‘urlFormat‘ => ‘path‘,
            ‘hostInfo‘ => ‘http://example.com‘,
            ‘secureHostInfo‘ => ‘https://example.com‘,
            ‘secureRoutes‘ => array(
                ‘site/login‘,   // site/login action
                ‘site/signup‘,  // site/signup action
                ‘settings‘,     // all actions of SettingsController
            ),
        ),
    ),
);

在上面的代码中,我们配置了urlManager登录、注册和所有设置页面为安全页面。如果,你想添加其他页面,只需向secureRoutes数组中添加相应内容。

现在我们可以像往常一样使用Yii::app()->createUrl()方法来创建 URL 地址。我们的urlManager会自动确定是否需要加上合适的前缀,如果需要的话,url 管理器也会执行 301 重定向。

时间: 2024-10-10 04:59:04

yii 框架 – 安全站点和非安全站点的 URL 管理的相关文章

YII框架分析笔记2:组件和事件行为管理

Yii是一个基于组件.用于开发大型 Web 应用的高性能 PHP 框架.CComponent几乎是所有类的基类,它控制着组件与事件的管理,其方法与属性如下,私有变量$_e数据存放事件(evnet,有些地方叫 hook),$_m数组存放行为(behavior). 组件管理 YII是一个纯oop框架,很多类中的成员变量的受保护或者私有的,CComponent中利用php中的魔术方法__get(),__set()来访问和设置属性,但这些方法的作用远不指这些.下面用__get()来说明 [php] vi

Yii框架分析(三)——类加载机制及应用组件的管理、配置、访问、创建

Yii应用的入口脚本引用出了Yii类,Yii类的定义: class Yii extends YiiBase { } 由yiic创建的应用里Yii类只是YiiBase类的“马甲”,我们也可以根据需求定制自己的Yii类. Yii(即YiiBase)是一个“helper class”,为整个应用提供静态和全局访问入口. Yii类的几个静态成员:$_aliases : 存放系统的别名对应的真实路径$_imports :$_classes :$_includePaths php include paths

使用 OAuth2-Server-php 在 Yii 框架上搭建 OAuth2 Server

Yii 有很多 extension 可以使用,在查看了 Yii 官网上提供的与 OAuth 相关的扩展后,发现了几个 OAuth2 的客户端扩展,但是并没有找到可以作为 OAuth2 Server 的扩展.因为 Yii 是组织良好的易于扩展的框架,所以完全可以集成其它的 PHP OAuth2 Server 实现方案.在 OAuth.net/2/ 官网上,提供了几个 PHP 实现的 OAuth2 Server.这里使用第一个 OAuth2-Server-php 来作为 Yii 框架的 OAuth2

Yii框架官方教程增补篇2——开始:安装Yii框架

Yii 的安装由如下两步组成: 从 yiiframework.com 下载 Yii 框架. 将 Yii 压缩包解压至一个 Web 可访问的目录(比如你的Web根目录/www/wwwroot/). 提示: 安装在 Web 目录不是必须的,每个 Yii 应用都有一个入口脚本,只有它才必须暴露给 Web 用户.其它 PHP 脚本(包括 Yii)应该保护起来不被 Web 访问,因为它们可能会被黑客利用. 需求: 安装完 Yii 以后你也许想验证一下你的服务器是否满足使用 Yii 的要求,只需浏览器中输入

yii框架AR详解

yii框架AR详解 虽 然Yii DAO可以处理事实上任何数据库相关的任务,但很可能我们会花费90%的时间用来编写一些通用的SQL语句来执行CRUD操作(创建,读取,更新和删除). 同时我们也很难维护这些PHP和SQL语句混合的代码,要解决这些问题,我们可以使用Active Record.    Active Record(AR)是一种流行的对象关系映射(ORM)技术.每个AR类代表一个数据表(或视图),其字段作为AR类的属性,一个AR实例代表在表中的 一行.常见的CRUD操作被作为AR类的方法

Yii框架中如何使用Yii::t()实现文本信息翻译和文件翻译

1.设置本地化语言 在protected/config文件夹下的main.php中做如下设置: return array( 'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..', 'name'=>'My Web Application', 'sourceLanguage'=>'en_us', 'language'=>'zh_cn', 2.定义翻译文件 这里我使用的时通过PHP文件实现文本信息翻译(更多方法说明参考Yii框架官方

YII框架源码分析(百度PHP大牛创作-原版-无广告无水印)

                        YII 框架源码分析             百度联盟事业部--黄银锋   目 录 1. 引言 3 1.1.Yii 简介 3 1.2.本文内容与结构 3 2.组件化与模块化 4 2.1.框架加载和运行流程 4 2.2.YiiBase 静态类 5 2.3.组件 6 2.4.模块 9 2.5 .App 应用   10 2.6 .WebApp 应用   11 3.系统组件 13 3.1.日志路由组件  13 3.2.Url 管理组件  15 3.3.异常

Yii框架分析(六)——Yii的别名管理与对象创建管理

YiiBase类为YII框架的运行提供了公共的基础功能:别名管理与对象创建管理. 在创建一个php的对象时,需要先include这个类的定义文件,然后再new这个对象.在不同环境下(开发环境/测试环境/线上环境),apache的webroot路径的配置可能不一样,所以这个类的定义文件的全路径就会不同,Yii框架通过YiiBase的别名管理来解决了这个问题. 在创建对象时,需要导入对应类的定义,经常需要使用这5个函数:include().include_once().require().requi

Yii框架 CURD

1.Yii框架的sql语句 说明:CDbCommand表示一个针对数据库执行的SQL语句 2.相关连接 yii连接:http://www.php100.com/manual/yii/CDbCommand.html 源代码:framework/db/CDbCommand.php 3.调用createCommand() 方法 (1)它通常通过调用CDbConnection::createCommand创建 (2)要执行一条非查询的SQL(如:insert,delete,update),调用execu