学习 yii 框架 - 安全站点和非安全站点的 URL 管理
2012-11-13 11:15
288 查看
在本文中我将描述怎么管理安全站点和非安全站点的 URL 管理。
安全站点的内容使用
当我们在
另一种情况是我们使用
为了实现上面的两个需求,我们可以继承 CUrlManager, 如下
现在,在应用程序的配置,我们应当使用我们的 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 重定向。
英文原文
相关文章推荐
- 安全站点和非安全站点的 URL 管理
- java安全框架-Shiro学习笔记(六)-url匹配方式+shiro标签使用+session会话机制
- 学习 yii 框架 - URL 连字符管理
- java安全框架-Shiro学习笔记(五)-Shiro集成Web
- SpringCloud系列四:Eureka 服务发现框架(定义 Eureka 服务端、Eureka 服务信息、Eureka 发现管理、Eureka 安全配置、Eureka-HA(高可用) 机制、Eureka 服务打包部署)
- Yii框架学习-创建与设置默认控制器与载入模板
- PHP开发框架之YII框架学习——碾压ThinkPHP不是梦
- 分布式服务框架学习笔记9 ActiveMQ入门2 管理、生产者/消费者模式
- Yii 框架学习--02 进阶
- 基于SSH实现员工管理系统之框架整合篇 学习笔记
- 6天敏捷 企业邮件管理系统(YII框架)
- yii 学习笔记三 、yii框架基础流程和控制器及父类分析
- Android资源管理框架(Asset Manager)简要介绍和学习计划
- YII Framework学习教程-YII的安全
- PHP Yii开源框架入门学习(三)Yii的相关配置总结
- Yii框架学习
- Android资源管理框架(Asset Manager)简要介绍和学习计划
- 关于后盾网yii框架的学习小结(10)--使用AR类的增删改查
- TensorFlow 深度学习框架(7)-- 变量管理及训练模型的保存与加载
- YII框架学习 第五天(1) widget model 修改数据 删除数据