如何确保CloudFront行为为/experience路径匹配正确源站
解决CloudFront多源站下/experience路径无尾斜杠时源站匹配错误问题
问题根源
CloudFront的缓存行为匹配逻辑是先匹配行为,再执行Origin Request函数。你访问website.com/experience时,初始请求URI为/experience,若未匹配到对应/experience的缓存行为(或行为顺序优先级有误),就会走默认的Origin1;即便后续CloudFront函数将URI改为/experience/index.html,源站已经在行为匹配阶段锁定为Origin1,导致拉取的文件不符合项目路径要求。
具体解决办法
办法1:新增精准匹配的缓存行为
- 在CloudFront控制台添加一条优先级更高的缓存行为,路径模式设为
/experience(不带星号),直接关联Origin2。 - 给这条新行为绑定你现有的尾斜杠处理CloudFront函数。
这样用户访问/experience时,会优先匹配这条精准行为,走Origin2,函数再将URI修正为/experience/index.html,就能正确获取Origin2中对应的文件,路径也符合项目的根目录预期。
办法2:用Viewer Request阶段重定向到带尾斜杠地址
使用Lambda@Edge的Viewer Request触发器,在请求到达CloudFront的第一阶段,将不带尾斜杠的/experience请求301重定向到/experience/。示例代码如下:
exports.handler = (event, context, callback) => { const request = event.Records[0].cf.request; const uri = request.uri; // 匹配不带尾斜杠、无文件扩展名的/experience请求 if (uri === '/experience' && !uri.includes('.')) { const response = { status: '301', statusDescription: 'Moved Permanently', headers: { location: [{ key: 'Location', value: '/experience/' }] } }; callback(null, response); } callback(null, request); };
Viewer Request阶段的处理早于缓存行为匹配,重定向后的/experience/会正确匹配你现有的/experience*行为,走Origin2。注意给重定向响应配置合理的缓存策略,避免缓存过期前无法修改规则。
额外注意事项
- 确认CloudFront缓存行为的顺序:更具体的行为(如新增的
/experience)必须排在默认行为之前,CloudFront按从上到下的顺序匹配,第一个匹配的行为生效。 - 若使用S3作为源站,检查Origin2的S3桶内文件结构:确保
index.html位于experience前缀下(对应你在行为中配置的源路径),避免出现文件找不到的情况。
内容的提问来源于stack exchange,提问作者meMidgety
相关产品推荐
相关产品推荐

