重写URL

当源站的资源路径发生变更,但希望保持面向用户的URL不变时,可通过边缘安全加速 ESA节点配置URL重写规则,在请求回源阶段自动修改URL中的路径和查询字符串(请求参数),并将改写后的URL发送至源站获取资源。该方式无需调整前端链接或源站配置,即可实现平滑迁移与无缝对接,保障业务连续性。

典型应用场景

  • 源站迁移:源站文件路径调整,但希望保持用户访问路径不变。

  • API版本适配:将用户请求的旧版本API路径重写为新版本。

  • 参数标准化:统一不同客户端传递的参数格式。

  • 路径美化:将复杂的后端路径映射为简洁的用户访问路径。

工作原理

URL重写仅作用于回源环节,不会影响ESA内部的请求处理链路。缓存键仍基于原始URL生成,确保缓存匹配的一致性;重写后的URL仅用于向源站发起回源请求,实现对外路径不变、对内灵活适配的目的。

执行流程

  1. 判断是否命中缓存:用户请求到达ESA边缘节点,ESA根据用户请求的原始URL查找缓存,如果缓存未命中,ESA执行URL重写规则,将原始URL修改为目标URL。

  2. 未命中缓存时使用改写后的URL回源:ESA使用重写后的URL向源站请求资源,源站响应并将请求内容缓存至ESAESA根据原始URL作为缓存键进行缓存。

  3. 返回缓存内容至客户端:ESA将缓存内容返回至客户端。

执行顺序

重写URL在缓存命中判断之后、实际回源请求发起之前执行。其执行顺序晚于源站选择规则,但早于回源请求头修改规则,确保在确定源站目标后对请求路径进行灵活调整,同时不影响后续头部处理逻辑。

配置重写URL规则

  1. ESA控制台,选择站点管理,在站点列单击目标站点。

  2. 在左侧导航栏,选择规则 > 转换规则

  3. 选择重写URL页签,单击新增规则,填写规则名称

  4. 如果请求匹配以下规则...区域设置要匹配的用户请求特征,具体配置规则请参见规则表达式的组成

  5. 重写URL区域设置需要重写的路径查询字符串,然后单击确定

    重写对象

    操作方式

    说明

    示例

    路径

    保留

    不修改原始路径。

    -

    重写到…

    静态

    替换为固定路径(必须以/开头)。

    /new/path

    动态

    使用表达式动态生成路径。

    concat("/v2", http.request.uri.path)

    查询字符串

    保留

    不修改原始查询参数。

    -

    重写到…

    静态

    替换为固定参数(不含)。

    version=new&type=api

    动态

    使用表达式动态生成参数。

    concat("version=new&", http.request.uri.query)

配置示例

示例一:源站路径迁移

  • 场景:源站将图片从/images/目录迁移至/static/img/目录。

  • 匹配条件starts_with(http.request.uri.path, "/images/")

  • 重写配置

    • 重写对象:路径

    • 操作方式:动态

    • 表达式regex_replace(http.request.uri.path, "^/images/", "/static/img/")

  • 效果演示

    • 用户请求https://example.com/images/logo.png

    • 回源请求https://origin.com/static/img/logo.png

示例二:API版本适配

  • 场景:将所有对旧版API/api/v1/的请求,在回源时自动指向新版/api/v2/,并附加一个版本标识参数。

  • 匹配条件starts_with(http.request.uri.path, "/api/v1/")

  • 重写配置

    • 重写对象:路径、查询字符串

    • 操作方式:动态

    • 路径重写表达式regex_replace(http.request.uri.path, "^/api/v1/", "/api/v2/")

    • 查询字符串重写表达式concat("api_version=v2&", http.request.uri.query)

  • 效果演示

    • 用户请求https://example.com/api/v1/users?limit=10

    • 回源请求https://origin.com/api/v2/users?api_version=v2&limit=10

示例三:参数标准化

  • 场景:不同客户端使用不同的参数名(如useriduid),统一重写为标准的user_id

  • 匹配条件http.request.uri.query contains "userid="

  • 重写配置

    • 重写对象:查询字符串

    • 操作方式:动态

    • 表达式regex_replace(http.request.uri.query, "userid=", "user_id=")

  • 效果演示

    • 用户请求https://example.com/profile?userid=123

    • 回源请求https://origin.com/profile?user_id=123

示例四:路径规范化

  • 场景:统一处理URL中因输入错误产生的连续斜杠(如 /////)。

  • 匹配条件http.request.uri.path contains "//"

  • 重写配置

    • 重写对象:路径

    • 操作方式:动态

    • 表达式regex_replace(http.request.uri.path, "/+", "/")

  • 效果演示

    • 用户请求https://example.com/path//to///resource

    • 回源请求https://origin.com/path/to/resource

示例五:删除所有查询参数

  • 场景:对于某些静态资源,为提高源站处理效率,需移除所有查询参数。

  • 匹配条件ends_with(http.request.uri.path, ".css")

  • 重写配置

    • 重写对象:查询字符串

    • 操作方式:静态,内容设置为空

  • 效果演示

    • 用户请求https://example.com/style.css?version=1.2.3

    • 回源请求https://origin.com/style.css

相关参考

参考文档

规则相关的功能,在生效优先级、可重入性、生效颗粒度上存在差异,详细情况请查看规则相关功能的特性说明

表达式参考

说明

此处变量和函数信息仅为参考,更多表达式详情,请参见规则表达式的组成

常用变量

变量

描述

示例

http.request.uri.path

请求路径

/api/user

http.request.uri.query

查询字符串(不含?

id=123&type=user

http.request.uri

完整URI(路径+查询)

/api/user?id=123

常用函数

函数

描述

示例

concat(str1, str2, ...)

拼接多个字符串

concat("/v2", http.request.uri.path)

regex_replace(text, pattern, replacement)

使用正则表达式进行查找和替换

regex_replace(http.request.uri.query, "userid=", "user_id=")

starts_with(text, prefix)

判断字符串是否以指定前缀开始

starts_with(http.request.uri.path, "/images/")

ends_with(text, suffix)

判断字符串是否以指定后缀结束

ends_with(http.request.uri.path, ".html")