如何配置可匹配查询字符串的CloudFront行为路径模式
CloudFront 匹配带查询参数的图片路径正确配置方法
首先明确核心规则:CloudFront 行为的路径模式仅对URI路径部分做匹配,完全不会读取?后的查询字符串内容,所以你写的带?、转义\?的模式从原理上就不可能生效,匹配阶段CloudFront会直接把查询字符串剥离,不会参与路径匹配逻辑。
另外你之前写的模式开头缺少前导斜杠/,本身也不符合CloudFront路径模式的格式要求。
具体配置步骤
你要实现的「/original路径下图片仅带查询参数时命中指定行为、无查询参数不命中」的需求,没法仅靠写路径模式实现,需要按以下方式配置:
- 新建优先级最高(优先级数字越小越先匹配)的缓存行为,路径模式填写为:
这个模式会覆盖/original路径下所有你需要的格式的图片请求,不管带不带查询参数都会先匹配到这个行为。/original/*.{jpg,gif,png,jpeg,webp} - 给这个行为绑定查看器请求(Viewer Request)节点触发的CloudFront Functions,用来过滤无查询参数的请求,参考代码如下:
function handler(event) { const request = event.request; const imgPathRule = /^\/original\/.+\.(jpg|jpeg|png|gif|webp)$/i; // 匹配到图片路径且无查询参数时,直接拦截或转发到你需要的目标规则 if (imgPathRule.test(request.uri) && Object.keys(request.querystring).length === 0) { // 按你的业务需求修改返回逻辑,比如返回403、或者转发到其他源 return { statusCode: 403, statusDescription: "Forbidden", headers: { "content-type": { value: "text/plain" } }, body: { encoding: "text", data: "Missing required parameters" } }; } // 带查询参数的图片请求正常放行,走当前行为的缓存、回源规则 return request; } - 给这个行为配置对应的缓存键、源请求策略:如果需要把查询参数转发给源站、参与缓存,就在缓存键策略里开启对应查询字符串的转发即可。
之前配置不生效的原因
original/*?*:一是缺少前导斜杠不符合格式要求,二是路径匹配不覆盖查询字符串部分,?不会被识别为查询字符串分隔符,只会被当成路径里的普通字符,永远匹配不到你的目标路径original/*\?*:除了上述问题外,CloudFront路径模式不支持正则转义字符,\也会被识别为路径普通字符,完全没有转义作用。
内容的提问来源于stack exchange,提问作者박진영
相关产品推荐
相关产品推荐

