如何通过AWS S3-Cloudfront实现基于用户代理的流量重定向
基于S3+Cloudfront实现UA区分流量分发的实现方案
你可以根据自身业务场景选择以下任意一种方案实现:
方案1:平滑迁移(复用原有Nginx逻辑,改造成本最低)
直接保留你现有的Nginx反向代理配置,仅修改代理目标地址即可:
- 分别为桌面端、移动端静态资源创建独立的S3桶,再分别绑定对应的Cloudfront分发,拿到两个分发的访问域名
- 修改Nginx配置中根路径的代理规则:
location / { proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $http_host; if ($ua_type = "@mobile") { proxy_pass "替换为移动端Cloudfront分发域名"; } if ($ua_type != "@mobile") { proxy_pass "替换为桌面端Cloudfront分发域名"; } } /api路径的配置完全保留,无需做任何改动
该方案完全复用原有UA匹配逻辑,迁移风险极低,不需要额外调整Cloudfront侧的路由规则。
方案2:纯Cloudfront实现(无需保留Nginx反向代理)
如果打算完全替换Nginx层,可通过Cloudfront Functions实现UA判断和路由转发:
- 提前准备两个S3桶分别存储桌面端、移动端静态资源,将两个桶都配置为Cloudfront分发的源
- 优先配置
/api路径的缓存行为:路径模式填/api/*,源指向原有后端服务地址,缓存策略选择禁用缓存的预设规则,保证API请求不会被静态缓存拦截 - 配置根路径
/*的默认缓存行为,然后创建Cloudfront Function挂载到该缓存行为的「查看器请求」阶段,函数代码示例如下:function handler(event) { const request = event.request; const userAgent = request.headers['user-agent'] ? request.headers['user-agent'].value : ''; // 直接复用原有Nginx的UA匹配正则,保证逻辑一致 const mobileReg = /(iPhone|iPod|Opera Mini|Android.*Mobile|NetFront|PSP|BlackBerry|Windows Phone)/i; if (mobileReg.test(userAgent)) { // 路由到移动端S3源 request.origin = { s3: { domainName: '你的移动端S3桶域名', region: 'S3桶所属区域代码', authMethod: 'none' // 私有桶可修改为对应鉴权方式 } }; request.headers['host'] = { value: '你的移动端S3桶域名' }; } else { // 路由到桌面端S3源 request.origin = { s3: { domainName: '你的桌面端S3桶域名', region: 'S3桶所属区域代码', authMethod: 'none' } }; request.headers['host'] = { value: '你的桌面端S3桶域名' }; } return request; }
注意事项
- 采用纯Cloudfront方案时,需要在根路径缓存行为的源请求策略中配置允许
User-Agent头透传,否则函数无法获取UA信息完成判断 - 静态资源的缓存键需配置为包含
User-Agent,避免不同端的资源缓存互相覆盖 - UA匹配规则直接复用原有Nginx的正则即可,保证新旧架构的访问逻辑完全一致
内容的提问来源于stack exchange,提问作者Shobit Mahajan
相关产品推荐
相关产品推荐

