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 重定向。
yii 框架 – 安全站点和非安全站点的 URL 管理的更多相关文章
- YII框架分析笔记2:组件和事件行为管理
Yii是一个基于组件.用于开发大型 Web 应用的高性能 PHP 框架.CComponent几乎是所有类的基类,它控制着组件与事件的管理,其方法与属性如下,私有变量$_e数据存放事件(evnet,有些 ...
- 《手把手教你》系列技巧篇(四十四)-java+ selenium自动化测试-处理https 安全问题或者非信任站点-下篇(详解教程)
1.简介 这一篇宏哥主要介绍webdriver在IE.Chrome和Firefox三个浏览器上处理不信任证书的情况,我们知道,有些网站打开是弹窗,SSL证书不可信任,但是你可以点击高级选项,继续打 ...
- 使用 OAuth2-Server-php 在 Yii 框架上搭建 OAuth2 Server
原文转自 http://www.cnblogs.com/ldms/p/4565547.html Yii 有很多 extension 可以使用,在查看了 Yii 官网上提供的与 OAuth 相关的扩展后 ...
- Yii框架-Smarty-整合
一.搭建yii框架 一.首先你得下个YII框架的源码 :下载地址:http://www.yiiframework.com/download/ 二.把下载到的源码解压放到一个PHP可访问的位置:如我的 ...
- yii框架
Yii Framework是一个基于组件.用于开发大型 Web 应用的高性能 PHP 框架.Yii提供了今日Web 2.0应用开发所需要的几乎一切功能.Yii是最有效率的PHP框架之一.Yii是创始人 ...
- YII框架路由和URL生成
路由和URL生成 当一个YII应用开始处理一个请求的时候,它首先要做的便是将请求的URL转化成一个路由.路由的作用是用于后续实例化相应的控制器和操作,以便处理请求,整个处理过程便叫做路由.路由的逆过程 ...
- YII框架的使用
YII框架的使用 spit: 吐痰,吐口水, 过去式: spat spat: 本身也可以作为一个单词, 意思是: "小打小闹""小的吵闹""小争吵&q ...
- yii框架的部署方法
yii框架(yii framework)的部署方法 刚開始学习的人来说,部署yii框架还是有一定难度的,Yii是一个基于组件.用于开发大型 Web 应用的高性能 PHP 框架.Yii提供了今日Web ...
- LAMP+YII框架配置中遇到的问题
以下列出了不同问题及答案: 1. 在yii框架中,改动数据库信息,主要有main.php和database.php两个文件. 2. 问题: watermark/2/text/aHR0cDovL2Jsb ...
随机推荐
- JAVA(4)之关于项目部署在tomcat
关于项目部署的报错问题一直是找不到项目 在重装几次tomcat9和tomcat7后找到了原因,关键原因是访问路径不正确,项目名拼写错误. 排除问题的思路如下(控制变量法) 工作方法和思路 列出步骤,从 ...
- VM虚拟机黑屏 鼠标进不去
#开始 可能是我脸黑吧 最近用虚拟机好几次都是黑屏 鼠标进不去 但是任务管理器显示确实有资源消耗 也就是说实际上应该是开机成功了(但是听不到声音 也许是没有开机吧) #解决方案 管理员权限打开 cmd ...
- 吴裕雄--天生自然神经网络与深度学习实战Python+Keras+TensorFlow:TensorFlow与神经网络的实现
import tensorflow as tf import numpy as np ''' 初始化运算图,它包含了上节提到的各个运算单元,它将为W,x,b,h构造运算部件,并将它们连接 起来 ''' ...
- 科技 - 5G
科技 - 5G 一.5G的概念 第五代移动通信技术(英语:5th generation mobile networks或5th generation wireless systems.5th-Gene ...
- Codeforces Round #618 E
题意: 给你一个n的数组,你可以进行无数次,选择区间使得区间内的值相加,然后区间的所有的值变成平均值. 使得最后数组的字典序最小 思路: 最后的数组一定是单调递增的,只要它比之前的平均值数大,就不会操 ...
- Java方法的定义和使用
/* 定义一个方法的格式: public static void 方法名称() { 方法体 } 方法名称的命名规则和变量一样,使用小驼峰. 方法体:也就是大括号当中可以包含任意条语句. 注意事项: 1 ...
- Hadoop学习笔记(三):分布式文件系统的写和读流程
写流程:怎么将文件切割成块,上传到服务器 读流程:怎么从不同的服务器来读取数据块 写流程 图一 图二 写的过程中:NameNode会给块分配存储块的位置,每次想要存储文件的时候都会在NameNode创 ...
- 排序算法之冒泡排序的python实现
冒泡排序算法的工作原理如下: 1. 比较相邻的元素.如果第一个比第二个大(升序),就交换他们两个. 2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.这步做完后,最后的元素会是最大 ...
- POJ-1087 A Plug for UNIX (网络流)
思路 电器数1 ~ 100,附带100种接口,注意题目:You notice that some of the devices use plugs for which there is no rece ...
- 批处理执行Testng
@echo off set LIB=项目的jar路径 set CLASSPATH=%LIB%\jar\commons-beanutils-.jar;%LIB%\jar\testng.jar;%LIB% ...