求助:Microsoft Edge更新后拦截S3预签名URL的302重定向下载
问题场景
我有一个存储在S3中、由CloudFront分发的ZIP文件。网站按钮点击后向服务器发起请求,服务器生成包含response-content-disposition=attachment参数的预签名URL,再通过302重定向到该URL强制触发下载。该方案稳定运行10年,上周Edge安全更新后开始被拦截。
可行解决方案与尝试思路
替换302重定向为前端直接触发下载
放弃服务器端跳转逻辑,改为前端获取预签名URL后,通过创建隐藏<a>标签主动触发下载,示例代码:// 前端获取预签名URL后执行 const downloadEl = document.createElement('a'); downloadEl.href = preSignedUrl; downloadEl.download = 'target-file.zip'; // 与response-content-disposition指定的文件名保持一致 downloadEl.style.display = 'none'; document.body.appendChild(downloadEl); downloadEl.click(); document.body.removeChild(downloadEl);这种方式让下载请求由用户主动操作触发,符合Edge最新安全策略对下载行为的判定标准。
规范预签名URL参数与响应头
确保response-content-disposition参数格式完整,例如:response-content-disposition=attachment; filename="your-file.zip";同时在CloudFront或S3配置中添加Content-Type: application/zip响应头,避免Edge因无法识别文件类型而拦截。检查CloudFront安全与缓存配置
排查CloudFront的WAF规则是否误将下载请求判定为恶意流量;同时清除CloudFront缓存,确保最新的响应头配置生效。改用POST请求触发下载(备选)
如果GET请求仍被拦截,可让前端发送POST请求到服务器,服务器返回预签名URL后由前端触发下载;对于小文件,也可直接由服务器返回文件内容并设置Content-Disposition: attachment响应头。
内容的提问来源于stack exchange,提问作者alagaesia

