当源站的资源路径发生变更,但希望保持面向用户的URL不变时,可通过边缘安全加速 ESA节点配置URL重写规则,在请求回源阶段自动修改URL中的路径和查询字符串(请求参数),并将改写后的URL发送至源站获取资源。该方式无需调整前端链接或源站配置,即可实现平滑迁移与无缝对接,保障业务连续性。
典型应用场景
源站迁移:源站文件路径调整,但希望保持用户访问路径不变。
API版本适配:将用户请求的旧版本API路径重写为新版本。
参数标准化:统一不同客户端传递的参数格式。
路径美化:将复杂的后端路径映射为简洁的用户访问路径。
工作原理
URL重写仅作用于回源环节,不会影响ESA内部的请求处理链路。缓存键仍基于原始URL生成,确保缓存匹配的一致性;重写后的URL仅用于向源站发起回源请求,实现对外路径不变、对内灵活适配的目的。
执行流程
判断是否命中缓存:用户请求到达ESA边缘节点,ESA根据用户请求的原始URL查找缓存,如果缓存未命中,ESA执行URL重写规则,将原始URL修改为目标URL。
未命中缓存时使用改写后的URL回源:ESA使用重写后的URL向源站请求资源,源站响应并将请求内容缓存至ESA,ESA根据原始URL作为缓存键进行缓存。
返回缓存内容至客户端:ESA将缓存内容返回至客户端。
执行顺序
重写URL在缓存命中判断之后、实际回源请求发起之前执行。其执行顺序晚于源站选择规则,但早于回源请求头修改规则,确保在确定源站目标后对请求路径进行灵活调整,同时不影响后续头部处理逻辑。
配置重写URL规则
在ESA控制台,选择站点管理,在站点列单击目标站点。
在左侧导航栏,选择。
选择重写URL页签,单击新增规则,填写规则名称。
在如果请求匹配以下规则...区域设置要匹配的用户请求特征,具体配置规则请参见规则表达式的组成。
在重写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
示例三:参数标准化
场景:不同客户端使用不同的参数名(如
userid和uid),统一重写为标准的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
相关参考
参考文档
规则相关的功能,在生效优先级、可重入性、生效颗粒度上存在差异,详细情况请查看规则相关功能的特性说明。
表达式参考
此处变量和函数信息仅为参考,更多表达式详情,请参见规则表达式的组成。
常用变量
变量 | 描述 | 示例 |
| 请求路径 |
|
| 查询字符串(不含 |
|
| 完整URI(路径+查询) |
|
常用函数
函数 | 描述 | 示例 |
| 拼接多个字符串 |
|
| 使用正则表达式进行查找和替换 |
|
| 判断字符串是否以指定前缀开始 |
|
| 判断字符串是否以指定后缀结束 |
|