S3访问带未编码查询参数的URL返回访问被拒绝原因排查
结论
这是文件上传阶段的编码错误,和AWS侧权限配置无关。
原因说明
- S3中的对象键本身为
image.jpg?date=1620831587318,说明?和后续的date=xxx根本不是URL查询参数,而是对象文件名的组成部分。 - 按照HTTP URL的解析规则,
?是分隔资源路径和查询参数的特殊字符:- 当你使用未编码的
?date=xxx访问时,S3会把?之前的部分当做要查找的对象键,也就是b4a24058-1e99-4cd8-b9b0-6749aecfdff8.jpg,这个对象在你的存储桶中不存在。S3对无列桶权限的用户默认返回403 Access Denied而非404,属于常规安全策略,很容易被误判为权限问题。 - 当你使用编码后的
%3Fdate=xxx访问时,%3F是?的URL编码形式,S3会将这部分识别为资源路径的一部分,匹配到实际存在的、文件名包含?date=xxx的对象,因此可以正常访问。
- 当你使用未编码的
解决方案
- 临时兼容:直接使用S3控制台给出的编码后对象URL访问即可。
- 彻底修复:调整文件上传逻辑,上传时不要把业务参数拼接进对象键,将
date参数从对象键中剥离,单独作为对象元数据或者业务侧独立参数存储,后续就可以正常使用「对象键+查询参数」的形式访问资源。
内容的提问来源于stack exchange,提问作者Kevin Amiranoff
相关产品推荐
相关产品推荐

