1. 首页
  2. 云分发(CDN)
  3. 功能配置
  4. 边缘规则
  5. 边缘规则在编程模式下的经典案例

边缘规则在编程模式下的经典案例

编程模式(案例)

1、自定义防盗链

需求描述:将请求 URL 按照一定的算法规则实现 token 防盗链,使用边缘规则来实现,会更加灵活和高效。token 防盗链详解请参见:

https://blog.upyun.com/?p=1177

请求 URL 示例:

/test.ts?key=68ddbe535557d6630a19cebde0cb9252&t=1481106349

以上请求 URL 是按照如下算法生成的,参见如下算法说明:

<?php
$etime = time() + 600; // 授权 10 分钟后过期 
$key = 'abc'; // token 防盗链密钥
$path = '/test.ts'; // 文件相对路径
$url = $path.'?key='.md5($key.$etime.$path).'&t='.$etime;
echo $url; 
?>

CDN 节点需要进行两层判断,一层就是对时间戳进行比较,另外一层就是按照约定的规则生成验证信息并进行比较,看是否一致。按照要求,可编写如下规则集来实现以上要求:

rules:
{
  "rule": "$WHEN($MATCH($_URI, '.ts$'),$OR($NOT($_GET_t),$NOT($_GET_key)))$EXIT(403)",
  "pattern": ""
}, 
{
   "rule": "$WHEN($MATCH($_URI, '.ts$'),$GT($_TIME, $_GET_t))$EXIT(401)",
   "pattern": ""
}, 
{
  "rule": "$WHEN($MATCH($_URI, '.ts$'),$NOT($EQ($MD5('abc'$_GET_t$_URI),$LOWER($_GET_key))))$EXIT(403)",
  "pattern": ""
}

规则释义:

第一条:当文件后缀为 ts 时,判断请求 URL 里面是否存在 tkey 参数,如果其中一个不存在,则返回 403;

第二条:当文件后缀为 ts 时,判断当前 CDN 节点 UNIX 时间是否大于请求参数里面的时间戳(也即参数 t 的值),否则返回 401;

第三条:当文件后缀为 ts 时,CDN 节点按照约定的算法规则生成验证信息(也即 MD5 值),判断生成的 MD5 值和请求参数 key 的值是否一致,不一致则返回 403;

2、边缘重定向

示例一:匹配 cookie 进行跳转

"rule": "$WHEN($NOT($EQ($_URI, /live.html)), $NOT($_COOKIE_token))$REDIRECT(http://test.example.com/no_token.html,301)",
"pattern": ""

规则释义:首先匹配请求 URI 是否为 /live.html,当 cookietoken 值为空时,则跳转到指定到地址 http://test.example.com/no_token.html

3、URL 改写

示例一:目录及参数改写

将请求 URL 转换为带参数的动态 URL,例如请求的 URL 为:

http://example.com/pay/25/8/...

需要 CDN 边缘节点转换为如下请求:

http://example.com/pay.php?payid=25&categoryid=8...

这个时候,pattern 部分需要提取目录数字,需要生成 $1$2 这样的变量,如下规则所示:

"rule": "/pay.php?productid=$1&categoryid=$2",
"pattern": "^pay/([0-9]+)/([0-9]+)/(.*?).html$"

规则释义:当解析的 url 符合规则 ^pay/([0-9]+)/([0-9]+)/(.*?).html$,那么将请求导向到 /pay.php?productid=$1&categoryid=$2

也即将 http://example.com/pay/25/8/... 转换为 http://example.com/pay.php?payid=25&categoryid=8...

示例二:文件名改写

pattern: /(.*)/playlist\.m3u8$
rule: /$1'.m3u8'

规则释义:当访问地址为 http://domain/app/stream/playlist.m3u8 时,将访问地址改写为 http://domain/app/stream.m3u8

应用场景:在直播应用场景中,因为客户端机制无法或者不方便升级的情况,可以通过 URL 改写,将 /stream/playlist.m3u8 改为 /stream.m3u8,其中 app 代表发布点,stream 代表流名。

4、请求/响应头修改

示例一:添加、删除请求头

"rule": "$ADD_REQ_HEADER(X-From-Cdn, upyun)",
"pattern": ""

规则释义:添加请求头 X-From-Cdn:upyun,识别 CDN 厂商。

"rule": "$DEL_REQ_HEADER(Accept-Encoding) ",
"pattern": ""

规则释义:删除请求头 Accept-Encoding ,无论终端是否发起 gzip 的请求,都进行 ungzip 的返回。

示例二:添加响应头

"rule": "$ADD_RSP_HEADER(CDN, UPYUN, 1) ",
"pattern": ""

规则释义:添加响应头 CDNUPYUN, 1 表示会覆盖掉已有的响应头,通过响应头也可以识别 CDN 厂商。

5、URL 限速

假如请求的 URL 为:http://test.example.com/mp4/4E10F356C0FEAD359C33DC5901307461-10.mp4 ,需要对该类型文件进行限速,限速要求为:前 20MB 不限速,20MB 之后限速 800 KB/s,规则可这样编写:

"rule": "$WHEN($1, $EQ($_HOST, 'test.example.com'))$LIMIT_RATE_AFTER(20, m)$LIMIT_RATE(800, k)",
"pattern": "^(/).+-10\.mp4$"

规则释义:当 $1 为真,且满足请求 HOSTtest.example.com 时 ,开始 20MB 不限速,后面限制到 800KB/s

6、大小写转换

该部分会使用到$LOWER(E) 函数,直接看规则:

"rule": "$WHEN($MATCH($LOWER($_URI), /uptest.png)) /UPtest.png",
"pattern": ""

规则释义:首先是获取请求 URI ,使用 $LOWER(E) 函数将 URI 转换为小写,和 /uptest.png 进行匹配,匹配成功,则直接将 URI 改写为/UPtest.png。如果需要将字符串转换为大写,使用 $UPPER(E) 函数。

7、数值比较

也即将字符串或者数字进行比较。例如: AB 进行比较,是否大于、大于等于、相等等逻辑,参见如下规则示例:

"rule": "$GT($_TIME,$ADD($INT($_GET_t,16,10),3600))",
"pattern": ""

规则释义:将请求 URL 中的 t 参数 由 16 进制转换为 10 进制,然后加上 3600 ,将相加得到的值和当前系统时间进行比较。这里使用到了 $GT(E1,E2) 函数,也即 E1 是否大于 E2,大于即返回 true 。另外,等于使用 $EQ(E1,E2) 函数,大于等于使用 $GE(E1,E2) 函数。

这篇文章有帮助吗?

相关文章