通过集成S3的AWS API Gateway检索含+字符文件名的文件遇问题
AWS API Gateway集成S3时
+字符被转义为%20的问题分析与解决 问题原因
API Gateway默认的路径编码逻辑存在特殊处理:+在URL查询参数中原本代表空格,但在路径部分+属于普通字符,API Gateway错误地将路径中的+(包括解码后的%2B)统一转义为%20,导致发送到S3的路径与签名计算时的路径不匹配,进而触发SigV4验证失败,同时返回错误的文件。
解决方案
方案1:Lambda代理集成中转(推荐)
- 创建轻量Lambda函数,通过AWS SDK直接调用S3的对象操作API(如
GetObject),手动处理请求路径中的+字符,完全绕过API Gateway的自动编码逻辑。 - 将API Gateway的集成类型设置为Lambda代理,让Lambda全权处理请求路径、参数和签名,确保传递给S3的路径完全符合预期。
方案2:自定义集成请求映射模板
- 在API Gateway的集成请求配置中,启用映射模板,针对对应请求类型(如
application/json)手动构造S3路径,使用API Gateway的内置工具正确编码字符:
示例映射模板(适配GET请求的路径参数):
这里的{ "path": "/$util.urlEncode($input.params('your-path-param'))" }$util.urlEncode会将+正确编码为%2B,而非%20,需根据实际路径参数名称调整模板变量。
方案3:调整Content Handling设置(有限适用)
- 在集成请求的"Content Handling"选项中选择"Passthrough",但该设置仅对请求体生效,对路径参数的编码控制能力有限,仅部分场景可缓解问题,需结合其他配置使用。
内容的提问来源于stack exchange,提问作者Martin Macak
相关产品推荐
相关产品推荐

