阿里云CDN支持URL重写,重写不影响CDN内部链路和缓存key,仅在回源请求时使用重写后的URL。
工作原理
通过重写回源URL规则,使请求URL与源站URL匹配,准确获取源站的资源,或者传递指定的参数给源站。
- 执行规则设置为“空”或者“break”的情况下,仅重写URL中的资源路径部分。  
- 执行规则设置为“enhance_break”的情况下,能够同时重写资源路径和请求参数。  
注意事项
- 单个域名可以配置的重写回源URL规则数量上限是50个。 
- 规则重写按照规则列表从上到下顺序依次执行,因此顺序可能会影响您的重写结果。 
- 配置重写回源URL规则时,可能与页签下的忽略参数功能冲突,配置时要需注意避免冲突。 
重写访问URL和重写回源URL的区别
| 功能 | 作用对象 | 客户端体验 | 应用场景 | 
| 影响的是客户端访问的URL,同时也会改变CDN节点回源的URL。 | 客户端看到的URL与实际访问的URL不一致,会发生变化。 | 常用于将旧域名的URL迁移、映射到新域名;或者为移动端和PC端提供不同的URL。 示例:访问 | |
| 影响的是CDN节点回源时访问的URL,而客户端访问的URL不变。 | 客户端看到的URL与实际访问的URL一致,没有变化。 | 常用于隐藏源站的真实URL结构,保护源站信息;或者通过URL映射,让CDN节点回源到不同的源站目录。 示例:访问 | 
重写访问URL示意图
- 客户端向CDN发起请求,请求的URL为 - old.example.com/hello。
- CDN接收到请求后,根据重写访问URL规则,CDN节点会在给客户端发送的302状态码响应信息的HTTP Location头部中放置新的URL地址信息,将请求的URL重写为 - new.example.com/hello。
- 客户端收到302状态码响应之后,将会向新的URL地址发起请求。 
- CDN节点检查缓存,如果缓存中有重写后URL的内容,直接返回给客户端;如果没有,则CDN节点向源站发起请求,请求的URL为重写后的 - new.example.com/hello。
- 源站接收到请求,返回响应内容给CDN节点。 
- CDN节点将响应内容缓存,并返回给客户端。 
重写回源URL示意图
- 客户端向CDN发起请求,请求的URL为 - cdn.example.com/files/hello.txt。
- CDN接收到请求后,检查缓存,如果缓存中有请求URL的内容,直接返回给客户端;如果没有,则CDN节点根据重写回源URL规则,将回源URL重写为 - origin.example.com/secret/files/hello.txt,向源站发起请求。
- 源站接收到请求后,向CDN节点返回响应内容。 
- CDN节点将响应内容缓存,并返回给客户端。 
配置回源URL
- 登录CDN控制台。 
- 在左侧导航栏,单击域名管理。 
- 在域名管理页面,找到目标域名,单击操作列的管理。 
- 在指定域名的左侧导航栏,单击回源配置。 
- 单击重写回源URL页签。 
- 单击添加。根据您的需求,配置待重写的Path、目标Path和执行规则。  - 参数 - 示例 - 说明 - 待重写的Path - ^/hello$ - 以正斜线(/)开头的URL,不含http://头及域名。必须使用PCRE正则表达式。 - 目标Path - /hello/test - 以正斜线(/)开头的URL,不含http://头及域名。支持使用PCRE正则表达式。 - 执行规则 - 空 - 如果配置了多条规则,在匹配执行当前规则后,将按照从上到下的顺序依次执行所有可以匹配的规则。 - break - 如果配置了多条规则,若请求的URL匹配了当前规则,匹配执行完当前规则后,剩余规则将不再匹配。 
- 只修改URL中的资源路径部分,不修改URL的参数,因此不会影响重写回源URL功能对URL中参数的重写。 
 - enhance break - 如果配置了多条规则,若请求的URL匹配了当前规则,匹配执行完当前规则后,剩余规则将不再匹配。 
- 与break相似,但是增加了对URL中参数部分的重写能力,对URL中参数的重写可能会与回源参数重写功能产生冲突,因此在同时配置这两个功能时,需要注意避免配置冲突。 
 
- 单击确定,使重写规则开始执行和生效。 - 您也可以在重写回源URL页面的规则列表中,单击修改或删除,对当前配置的规则进行相应操作。 
配置示例
- 示例一:执行空规则。- 待重写的Path - ^/hello$ - 目标Path - /index.html - 执行规则 - 空 - 结果说明 - 原始请求: - http://example.com/hello- 重写后的回源请求: - http://example.com/index.html- 该请求将会继续匹配重写回源URL规则列表中其余的规则。 
- 示例二:执行break规则。- 待重写的Path - ^/hello.jpg$ - 目标Path - /image/hello.jpg - 执行规则 - break - 结果说明 - 原始请求: - http://example.com/hello.jpg- 重写后的回源请求: - http://example.com/image/hello.jpg- 该请求将不再继续匹配重写回源URL规则列表中其余的规则。 
- 示例三:执行enhance break规则。- 待重写的Path - ^/hello.jpg?code=123$ - 目标Path - /image/hello.jpg?code=321 - 执行规则 - enhance break - 结果说明 - 原始请求: - http://example.com/hello.jpg?code=123- 重写后的回源请求: - http://example.com/image/hello.jpg?code=321- 该请求将不再继续匹配重写回源URL规则列表中其余的规则。 
- 示例四:在文件名是变量的情况下对根目录添加URL前缀。- 例如:将包含/xxx的URL(xxx代表任意文件名称,例如:/hello.jpg、/hello.html等等)重写为/image/xxx,即对根目录下的任意文件的URL都插入路径/image。 - 待重写的Path - ^(.*)$ 说明- ^表示匹配字符串的开始位置;- (.*)是一个分组,其中- .表示匹配任意单个字符(除了换行符),- *表示匹配前面的字符或分组零次或多次,可以在目标Path中通过$1来调用分组的变量内容;- $表示匹配字符串的结束位置。所以,- ^(.*)$的意思是:匹配整个字符串,从开始到结束,中间可以包含任意字符(除了换行符),并将匹配到的内容捕获到一个分组中。例如,对于字符串- "hello world"来说,- ^(.*)$会匹配整个字符串,并将- "hello world"捕获到第一个分组中。- 目标Path - /image$1 说明- /image表示匹配字符串- "/image";- $1表示引用第一个捕获分组的内容,- $2表示引用第二个捕获分组的内容,依此类推。所以,- /image$1的意思是:匹配字符串- "/image"后面紧跟着第一个捕获分组的内容。例如,如果第一个捕获分组的内容是- "abc",那么- /image$1将匹配字符串- "/imageabc"。需要注意的是,- $1引用的是捕获分组的内容,而不是字面量- "$1"。如果想要匹配字面量- "$1",需要使用转义字符- "\$1"。- 执行规则 - break - 结果说明 - 原始请求: - http://example.com/hello.jpg- 重写后的回源请求: - http://example.com/image/hello.jpg
- 原始请求: - http://example.com/hello.html- 重写后的回源请求: - http://example.com/image/hello.html
 - 该请求将不再继续匹配回源URL重写规则列表中其余的规则。 
- 示例五:在文件名是变量的情况下对指定目录添加URL前缀。- 例如:将包含/live/xxx的URL(xxx代表任意文件名称,例如:/live/hello.jpg、/live/hello.html 等等)重写为/image/live/xxx,即对目录/live下的任意文件的URL都插入路径/image。 - 待重写的Path - ^/live/(.*)$ - 目标Path - /image/live/$1 - 执行规则 - break - 结果说明 - 原始请求: - http://example.com/live/hello.jpg- 重写后的回源请求: - http://example.com/image/live/hello.jpg
- 原始请求: - http://example.com/live/hello.html- 重写后的回源请求: - http://example.com/image/live/hello.html
 - 该请求将不再继续匹配回源URL重写规则列表中其余的规则。 
- 示例六:匹配多条规则时,执行空规则。- 配置两条规则如下图所示:  - 结果说明: - 原始请求: - http://example.com/image_01.png
- 重写后的回源请求: - http://example.com/image/image_02.png说明- 先匹配第一条规则,重写为 - http://example.com/image_02.png,继续匹配第二条规则,最终重写为- http://example.com/image/image_02.png。
 
- 示例七:匹配多条规则时,执行break规则。- 配置两条规则如下图所示:  - 结果说明: - 原始请求: - http://example.com/image_01.png
- 重写后的回源请求: - http://example.com/image_02.png说明- 先匹配第一条规则,重写为 - http://example.com/image_02.png,由于第一条规则设置为break,所以不再匹配后续规则。