[关闭]
@upyun 2017-05-20T03:18:13.000000Z 字数 2082 阅读 1038

Rewrite 实例说明

微信文章


1.鉴权介绍
阿里云支持的三种鉴权方式:
https://help.aliyun.com/document_detail/27135.html 。 可以去阅读一下三种鉴权的介绍,我这里就不详细的展开。直接讲讲怎么使用又拍云的Rewrite规则实现A鉴权的功能。
A鉴权示例说明
通过 req_auth 请求对象:

http:// cdn.example.com/video/standard/1K.html
密钥设为:aliyuncdnexp1234 (由用户自行设置)
鉴权配置文件失效日期为:2015年10月10日00:00:00,计算出来的秒数为1444435200
则CDN服务器会构造一个用于计算Hashvalue的签名字符串:
/video/standard/1K.html-1444435200-0-0-aliyuncdnexp1234
CDN服务器会根据该签名字符串计算HashValue:
HashValue = md5sum("/video/standard/1K.html-1444435200-0-0-aliyuncdnexp1234") = 80cd3862d699b7118eed99103f2a3a4f
则请求时url为:
http://cdn.example.com/video/standard/1K.html?auth_key=1444435200-0-0-80cd3862d699b7118eed99103f2a3a4f
计算出来的HashValue与用户请求中带的 md5hash = 80cd3862d699b7118eed99103f2a3a4f 值一致,于是鉴权通过。

Rewrite规则实现说明
注意:三条规则按照顺序填写,不要勾线break。
1.第一判断URI的格式是不是符合规则,(auth_key参数里面含有三个‘-’符号) 不符合规则直接返回HTTP 403错误。

$WHEN($NOT($ALL($_GET_auth_key,$MATCH($PCALL($_GET_auth_key),'^[^-]*-[^-]+-[^-]+-[^-]*$'))))$EXIT(403)

2.第二判断请求中的时间戳 是否小于当前时间,如果小于,则认为过期失效并返回HTTP 403错误。

$CAPTURE($_GET_auth_key,'([^-]*)-([^-]+)-([^-]+)-([^-]*)') $WHEN($NOT($GT($1.1,$_TIME)))$EXIT(403)

3.使用MD5算法算出 HashValue ,再和请求中带来的 md5hash 进行比对。比对结果一致,则认为鉴权通过,返回文件。否则鉴权失败,返回HTTP 403错误。

$CAPTURE($_GET_auth_key, '([^-]*)-([^-]*)-([^-]*)-([^-]*)') $WHEN($NOT($EQ($MD5($_URI'-'$PCALL($1.1)'-'$PCALL($1.2)'-'$PCALL($1.3)'-aliyuncdnexp1234'), $1.4))) $EXIT(403)

主要函数变量使用:

函数和变量 介绍
$PCALL($_GET_auth_key) 保护模式下解析auth_key后面的参数 ,失败时返回空字符串
$MATCH PCRE 匹配,auth_key后面的参数是否符合实例规则
$CAPTURE 按 E2 pattern 对 E1 进行捕获,n 为当前 CAPTURE 出现的次序,m 表示匹配分组,比如其中$1.1获取的是timestamp参数
$_TIME 获取当前服务器时间,格式为 UNIX TIME
$GT 数字比较,是否大于,用于校验timestamp是否大于当前时间
$_URI 请求的 URI,不包含参数
$MD5 计算MD5值
$NOT 不成立时返回 true,这个例子里面用的比较多,可以注意一下

鉴权代码

<?php
$etime = time() + 600; // 授权 10 分钟后过期
    $domain = 'cdn.example.com' ;
$key = 'aliyuncdnexp1234'; //  密钥设为:aliyuncdnexp1234
    $path = '/play/.m3u8'; // 文件相对路径
$rand = '0'; //设置的随机数
    $uid = '0'; // 设置的uid参数
$url = $path.'-'.$etime.'-'.$rand.'-'.$uid.'-'.$key; //计算MD5的字符串拼接
$sign = md5($url); //签名
$Url = $domain.$path.'?auth_key='.$etime.'-'.$rand.'-'.$uid.'-'.$sign; //访问URL
    echo "访问URL是:";
    echo "\n";
    echo $Url;
echo "\n";

总结
通过又拍云的Rewrite规则,通过变量对URL的处理,截取。在使用函数计算MD5值,比较时间是否过期,请求中带来的 md5hash和服务端计算的MD5值是否一致,请求符合服务端的判断,认为鉴权通过,返回文件。否则鉴权失败,返回HTTP 403错误。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注