重写访问URL

如果源站资源的存放路径变化,CDN节点存放资源的路径也会随之变化。用户请求的URL路径如果没有变化,就需要CDN节点来重写用户请求的URL,将请求URL重定向到目标Path,减少回源,提升客户端访问性能。

背景信息

HTTP 302状态码(即302 Found),可表示资源被临时改变了位置。配置访问URL重写后,CDN节点会在给客户端发送的302状态码响应信息的HTTP Location头部中放置新的URL地址信息,客户端收到302状态码响应之后,将会向新的URL地址发起请求。

配置访问URL重写规则后,CDN节点默认给客户端发送302重定向状态码,同时也支持303和307重定向状态码,如果您需要修改重定向状态码,可以通过填写信息申请。

编码

含义

处理方法

典型应用场景

302

Found

GET方法不会发生变更,其他方法有可能会变更为GET方法。

由于不可预见的原因该页面暂不可用。在这种情况下,搜索引擎不会更新它们的链接。

303

See Other

GET方法不会发生变更,其他方法会变更为 GET 方法(消息主体会丢失)。

用于PUT或POST请求完成之后进行页面跳转,防止由于页面刷新导致的操作的重复触发。

307

Temporary Redirect

方法和消息主体都不发生变化。

由于不可预见的原因该页面暂不可用。在这种情况下,搜索引擎不会更新它们的链接。当站点支持非 GET 方法的链接或操作的时候,该状态码优于 302 状态码。

重要

单个域名最多可以配置50条重写规则。配置多条规则时,按照CDN控制台访问URL重写列表由上而下的顺序执行。

重写访问URL和重写回源URL的区别

功能

作用对象

客户端体验

应用场景

重写访问URL

影响的是客户端访问的URL,同时也会改变CDN节点回源的URL。

客户端看到的URL与实际访问的URL不一致,会发生变化。

常用于将旧域名的URL迁移、映射到新域名;或者为移动端和PC端提供不同的URL。

示例:访问old.example.com/hello时,重写访问URL为new.example.com/hello

重写回源URL

影响的是CDN节点回源时访问的URL,而客户端访问的URL不变。

客户端看到的URL与实际访问的URL一致,没有变化。

常用于隐藏源站的真实URL结构,保护源站信息;或者通过URL映射,让CDN节点回源到不同的源站目录。

示例:访问cdn.example.com/hello时重写回源URL为origin.example.com/source/hello

重写访问URL示意图

image
  1. 客户端向CDN发起请求,请求的URL为old.example.com/hello

  2. CDN接收到请求后,根据重写访问URL规则,CDN节点会在给客户端发送的302状态码响应信息的HTTP Location头部中放置新的URL地址信息,将请求的URL重写为new.example.com/hello

  3. 客户端收到302状态码响应之后,将会向新的URL地址发起请求。

  4. CDN节点检查缓存,如果缓存中有重写后URL的内容,直接返回给客户端;如果没有,则CDN节点向源站发起请求,请求的URL为重写后的new.example.com/hello

  5. 源站接收到请求,返回响应内容给CDN节点。

  6. CDN节点将响应内容缓存,并返回给客户端。

重写回源URL示意图

image
  1. 客户端向CDN发起请求,请求的URL为cdn.example.com/files/hello.txt

  2. CDN接收到请求后,检查缓存,如果缓存中有请求URL的内容,直接返回给客户端;如果没有,则CDN节点根据重写回源URL规则,将回源URL重写为 origin.example.com/secret/files/hello.txt,向源站发起请求。

  3. 源站接收到请求后,向CDN节点返回响应内容。

  4. CDN节点将响应内容缓存,并返回给客户端。

操作步骤

  1. 登录CDN控制台

  2. 在左侧导航栏,单击域名管理

  3. 域名管理页面,找到目标域名,单击操作列的管理

  4. 在指定域名的左侧导航栏,单击缓存配置

  5. 单击重写访问URL页签。

  6. 单击添加,根据您的实际需求,配置访问URL重写参数。

    image

    参数

    说明

    待重写的Path

    • 执行规则设置为Break的情况下,仅支持以/开头的Path,不含协议头和域名;

    • 执行规则设置为Redirect的情况下,可以包含协议头和域名。支持PCRE正则表达式,如 ^/hello$

    目标Path

    • 执行规则设置为Break的情况下,仅支持以/开头的Path,不含协议头和域名。

    • 执行规则设置为Redirect的情况下,可以包含协议头和域名。支持PCRE正则表达式,例如:常用$1$2来捕获待改写Path中圆括号内的字符串。

    执行规则

    • 默认支持RedirectBreak这两种规则。

      • Redirect:如果请求URL匹配了某条规则,该请求将会被302重定向到目标URL,CDN节点返回给客户端的Location信息为目标URL(不修改原始URL中的参数)。执行完当前规则后,当存在其他配置规则时,会继续匹配剩余规则。

      • Break:如果请求URL匹配了某条规则,该请求将会被重写为目标URL(不修改原始URL中的参数)。执行完当前规则后,当存在其他配置规则时,将不再匹配剩余规则。

    • 同时支持enhance-breakenhance_redirect三种规则,这三种规则需要提交工单申请后台配置。

      • : 配置了多条规则的情况下,如果请求URL匹配了某条规则,执行完当前规则以后,还会继续匹配后续规则。

      • enhance_break : 和 break类似,但是会修改包含参数在内的整个URL。

      • enhance_redirect : 和redirect类似,但是会修改包含参数在内的整个URL。

    说明

    不同的执行规则使用的重写方式不同,重写后的URL是否支持其他域名、其他协议也存在差异:

    • Breakenhance_break采用直接重写用户请求URL的方式,不支持重写为其他域名,也不支持重写为其他协议(例如从HTTP协议重写为HTTPS协议)。

    • Redirectenhance_redirect采用302跳转方式实现URL重写,支持重写为其他域名,也支持重写为其他协议:

      • 302 Location地址除了可以设置为当前的加速域名,还支持设置为其他域名,可以实现这样的效果:原始URL使用的域名是example.com,重写后的URL使用新的域名aliyundoc.com

      • 302 Location地址支持使用其他协议,可以实现这样的效果:原始URL使用HTTP协议,重写后的URL使用HTTPS协议。

    规则条件

    规则条件能够对用户请求中携带的各种参数信息进行识别,以此来决定某个配置是否对该请求生效。

    • 不使用:不使用规则条件。

    • 选择已配置的规则引擎,新增或修改规则引擎请参见规则引擎

    开启Nginx变量计算

    默认为不勾选,勾选后可以在目标URL中使用Nginx内置变量。配置示例如下:

    • 待重写的Path:^/test.jpg$

    • 目标Path:/test.${arg_type}

    • 开启Nginx变量计算以后实现的效果是会把${nginx_var}值计算出来,${arg_type}表示原始URL中参数type的值。

    说明

    该参数需提交工单申请后台配置。

  7. 单击确定,完成配置。

    成功配置重写功能后,您可以在重写列表中,对当前的配置进行修改删除操作。

配置示例

访问URL重写规则按照正则表达式配置如下图所示:正则表达

待重写的Path为正则表达式 ^/hello$,这是一个用于匹配特定字符串模式的表达式,它的含义如下:

  • ^: 匹配字符串的开始位置。

  • /hello: 匹配字符串 "/hello"。

  • $: 匹配字符串的结束位置。

这个正则表达式会精确匹配字符串 "/hello",其他任何字符串都不会被匹配。例如:

  • "/hello" 可以被匹配。

  • "/hello/" 不能被匹配,因为结尾多了一个 "/"。

  • "hello" 不能被匹配,因为开头缺少了 "/"。

  • "/hello world" 不能被匹配,因为在 "/hello" 后面还有其他字符。

客户端请求http://example.aliyundoc.com/hello时,请求中包含/hello,CDN节点会在302状态码的Location信息里写入新的URL地址http://example.aliyundoc.com/index.html,并返回给客户端,客户端对http://example.aliyundoc.com/index.html发起请求。