[关闭]
@upyun 2016-11-25T03:22:35.000000Z 字数 2988 阅读 1042

Rewrite 规则整理

rewirte 正则 表达式 UPYUN

添加响应头

豆瓣需求在这个域名下: img1.doubanio.com/lpic/ 加上一个
Access-Control-Allow-Origin: * 的响应头。此需求可以通过 Rewrite 的功能实现,具体规则如下

$WHEN($MATCH($_URI, '^/lpic/'))$ADD_RSP_HEADER(Access-Control-Allow-Origin, ‘*’)

意思是当 URI 匹配到 /pic/ 的时候,添加 Access-Control-Allow-Origin: * 的响应头

设置防盗链

奥点云需求兼容网宿的防盗链规则,即使用 ?k=&t= 的形式,k = MD5(秘钥 + 过期时间 + URI) , t = 过期时间戳。过期时间的格式是 16 进制。 Rewrite 规则如下
$WHEN($NOT($ALL($GT($INT($_GET_, 16), &_Time),$EQ($_GET_key, $MD5(test $_URI $_HOST $_GET_TIME)))))$EXIT(403)

上面的规则主要是比较 time 和 key 的值,只有当过期时间大于本地时间,同时 key 的值满足 MD5 之后的几个参数才可以,当不满足的时候,会返回 403.
测试 URL: http://1011.live-vod.cdn.beepony.com/test.png?key=1b7915a3059bf510500316ed262b58da&time=575f3027

将某些特殊文件重定向

用户希望将空间中所有的 html 后缀的文件被访问到的时候,重定向到 403
{"rule":"$WHEN($MATCH($_URI, '\\\\.html($|\\\\?)'))$EXIT(403)","break":true,"pattern":""}

匹配特殊的目录

用户空间部分文件的访问路径为:/aa/bb/xxx.jpg,用户希望所有访问到这个路径的 url 变成 /image1/aa/bb/xxx.jpg,即添加 /image1,Rewrite 规则如下

  1. $WHEN($EQ($_HOST, 'img192.gtobal.com'), $NOT($MATCH($_URI, '^/image1')))/image1$_URI

隐藏 APK 文件后缀

dl-source空间下所有的.apk为后缀的文件,再请求为-ndy时,rewrite跳转到.apk文件例子:请求http://www.shtmzn.com/xudong/yx20471a-ndy,访问的是http://www.shtmzn.com/xudong/yx20471a.apk,rewrite 规则如下:

  1. rule: $ADD_RSP_HEADER(Content-Disposition, 'attachment; filename="'$2'.apk"')$1 .apk
  2. pattern: ^(.+/([^/]+))-ndy$

强制指定后缀文件从 HTTPS 访问

  1. Rule: $WHEN($1, $EQ($_SCHEME, http))$REDIRECT(https://$_HOST$_URI, 302)
  2. pattern: \.(js|css)$

设置原图返回 404

  1. $WHEN($1, $NOT($MATCH($_URI, !)))$EXIT(404)
  2. \.(jpg|png|gif)$

访问图片跳转到缩略图

  1. rule: $WHEN($1)$_URI!nrimg
  2. pattern: ^(/)d/new/[^!]+$

对资源限速

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

当 404 的时候跳转到其他 URL

  1. $REDIRECT404($1), $1 为待跳转的 url

只允许后台设置的缩略图访问

案例:用户 url 是:http://i1.carimg.com/0/photo/836/019/000/648572c37cb09a42.jpg,文件保护密钥集合(分隔符 !):ZS、m、s、hmm、I、mm、zmm、620、800、500、300、150、100

  1. rules: $WHEN($ANY($NOT($1), $NOT($MATCH($2, \(ZS|m|s|hmm|l|mm|zmm|620|800|500|300|150|100\)\$))))$EXIT(404)
  2. pattern:^/.+\.(jpg|png|gif|webp|jpeg|bmp|svg)!(.+)$

Franky 后台通过 rewrite 添加原图保护密钥

  1. 第一条
  2. Rewrite 规则: $WHEN($1, $NOT($EQ($3, '!123'))) $REDIRECT(http://www.upyun.com, 302)
  3. URI 提取正则: (.+\.(jpg|png|gif|webp|jpeg|bmp|svg))(!.+)?$
  4. Break: 开启
  5. 语句作用:
  6. 判断对指定文件访问请求是否携带秘钥,如果没秘钥或秘钥不正确,则返回指定状态码;如果有秘钥且正确,进入下一条语句。
  7. 附加说明:
  8. 1`!123` `123` 表示文件保护秘钥。`!`不能省略。
  9. 2`302` 表示请求没带秘钥时,跳转到 `http://www.upyun.com` `http://www.upyun.com`是可以自定义的。
  10. 3`jpg|png|gif|webp|jpeg|bmp|svg` 表示文件秘钥作用的文件类型,这里是图片。
  11. 第二条
  12. Rewrite 规则: $WHEN($1)$1
  13. URI 提取正则: (.+\.(jpg|png|gif|webp|jpeg|bmp|svg))(!.+)?$
  14. Break: 开启
  15. 语句含义:
  16. 当请求含有秘钥且秘钥正确时,用不带秘钥请求去请求文件。

URL 加参数更新文件

需求:

请求fileversion.ver?v=0.0.77的时候cdn边缘节点会去存储拿fileversion.ver_v=0.0.77

实现:

  1. $WHEN($MATCH($_URI,'fileversion.ver$'),$MATCH($_QUERY,'v='))$URI _ $_QUERY
  1. $WHEN($MATCH($_URI,'fileversion.ver$'),$MATCH($_QUERY,'v='))$URI'_'$_QUERY

当请求这个 url:http://binimg.b0.upaiyun.com/fileversion.ver?v=0.0.77 的时候, Rewrite 会把请求改写成 fileversion.ver_v=0.0.77,前一个大小是 1M,后一个文件大小是 2M。

解释:

当 uri 匹配到文件以 fileversion.ver 结尾,同时 query 查询参数里面包含 v= 的时候,把 uri 改写成参数前面加 _ 下划线的形式。
特别得,这个 _ 下划线前后均有空格。因为解析的时候,如果不加空格,就会整体取值了。同理,如果把 _ 换成其他字符,比如 test 也一样

在两个 url 中随机跳转

需求:

在 baidu.com 和 google.com 这两个 url 随机跳转,如何用 rewrite 实现

实现

  1. $SELECT($EQ($RANDI(1,2),1),baidu.com,google.com)
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注