如何通过Lambda@Edge重定向POST/GET类型的API Gateway请求
问题根源
- 你当前使用的
301重定向状态码不符合POST请求的重定向需求:主流浏览器收到POST请求返回的301响应后,会自动将重定向后的请求修改为GET方法,同时丢弃原始POST的请求体数据。 - API Gateway在收到未定义路由/未定义请求方法的请求时,会统一返回
"message": "Missing Authentication Token"错误,和实际鉴权逻辑无关:你对应路径只声明了POST类型的端点,浏览器重定向过来的GET请求没有匹配的路由,自然会触发报错。
修复方案
方案1:更换重定向状态码(推荐,改造成本最低)
307/308状态码的HTTP规范明确要求:浏览器重定向时不能修改原始请求的HTTP方法,也不能丢弃请求体,完全适配POST请求的重定向场景。
- 临时重定向用
307 Temporary Redirect - 永久重定向用
308 Permanent Redirect
修改你的Lambda@Edge代码如下:
response = { status: '307', // 按需替换为308即可 headers: { 'location': [{ key: 'Location', value: 'https://pgasdfddfs6.execute-api.us-east-1.amazonaws.com/dev' + uri }] } };
方案2:直接配置CloudFront源站(性能更优)
不要用重定向的方式转发请求,直接将你的API Gateway配置为CloudFront的源站,在CloudFront层做路径rewrite即可,这种方式不会修改请求方法、请求体,也不会产生额外的重定向开销。
额外校验项
修改状态码后如果仍然报错,可逐一排查以下配置:
- 确认API Gateway对应路径的POST方法已经开启了正确的CORS规则,允许跨域请求
- 确认Lambda@Edge没有过滤掉API Gateway需要的鉴权头、自定义请求头
内容的提问来源于stack exchange,提问作者Fernando Santiago
相关产品推荐
相关产品推荐

