Redirect 使用响应302从aws api网关重定向

Redirect 使用响应302从aws api网关重定向,redirect,aws-api-gateway,Redirect,Aws Api Gateway,我正在努力使重定向在AWSAPI网关中工作。我将方法响应配置为在标题中包含Location,并在集成响应中,将参数设置为:Location=Integration.response.body.Location。但是,当我测试API时,它没有将我重定向到该位置,而是在API页面上显示该位置的文本。以前有人遇到过这种情况吗 显示的字符串实际上是正确的位置,但API不会将我重定向到该URL 您确定API端点返回302吗 确保没有为方法定义除302之外的任何2xx或3xx响应代码。您只能有一个“成功”响

我正在努力使重定向在AWSAPI网关中工作。我将方法响应配置为在标题中包含Location,并在集成响应中,将参数设置为:Location=Integration.response.body.Location。但是,当我测试API时,它没有将我重定向到该位置,而是在API页面上显示该位置的文本。以前有人遇到过这种情况吗


显示的字符串实际上是正确的位置,但API不会将我重定向到该URL

您确定API端点返回302吗


确保没有为方法定义除302之外的任何2xx或3xx响应代码。您只能有一个“成功”响应代码映射。2xx和3xx代码都被认为是成功代码。

好的,我发现了问题。我存储位置的变量被定义为字符串而不是对象,这就是为什么网页将其显示为文本。它现在正在重定向到页面。

首先,您要为“location”标题创建一个方法响应。然后,您希望从Lambda的响应映射位置头值。在Node.js运行时中,您可以将其映射到
integration.response.body.errorType
。这样,您可以通过执行以下操作重定向:

// Returns 302 or 301
var err = new Error("HandlerDemo.ResponseFound Redirection: Resource found elsewhere");
err.name = "http://a-different-uri";
context.done(err, {});

有关完整写操作,请参阅:

使用API网关进行Lambda重定向有一种更简单的方法:

module.exports.handler=(事件、上下文、回调)=>Promise.resolve(事件)
//.然后(Dostuff Witheventobject)
.然后(()=>回调(null{
状态代码:302,
标题:{
地点:'https://gohere.com',
},
}))//成功!
.catch(回调);//带错误的失败函数

此示例来自

可以使用API网关重定向到硬编码URL,而无需使用AWS Lambda。以下是导出的OpenAPI 3.0定义,说明了如何实现这一点:

openapi: "3.0.0"
info:
  title: 'TheApiName'
  version: ''
paths:
  "/":
    get:
      responses:
        "302":
          description: "302 response"
          headers:
            Location:
              schema:
                type: "string"
          content: {}
      x-amazon-apigateway-integration:
        responses:
          default:
            statusCode: "302"
            responseParameters:
              method.response.header.Location: "'https://github.com/lukedemi/adventbot'"
        requestTemplates:
          application/json: "{\"statusCode\": 200}"
        passthroughBehavior: "when_no_match"
        type: "mock"

请注意,当您导入此API模板时,仍然需要“部署”它,并且在执行此操作时需要创建“阶段”,然后将API:Stage与自定义域关联(在API网关中首次创建自定义域时需要ACM证书)然后,由于需要使用空的基本路径(解析为
/
),并且由于API网关的工作方式,该映射不允许任何其他
/任何
路由,因此只能将此单一API部署到域中

以下是我在Lambda中实际使用的内容。我让API单独工作。API收集发送给它的数据:表单数据。这是一段非常简单的代码,你可以用它做很多事情

我在lambda中处理表单数据:提取变量,重新验证它们,将它们保存到dynamoDB中,然后发送一封电子邮件,要求新注册者验证他们满足GDPR的意图,并确保我从有能力和有兴趣进行交互的人那里获取了真实的电子邮件地址,然后提供屏幕响应

屏幕上的响应是重定向到特定的感谢页面,解释他们需要检查电子邮件并单击链接

在本例中,您只需为登录页创建swop Amazon.com

通过使用变量:redirectURL,我可以改变响应,并在不同的网站页面上对一系列不同的表单使用API和Lambda。如果愿意,我可以将重定向设置为表单本身中的隐藏表单字段

让我们重新定向URL=https://amazon.com/';
var响应={
“状态代码”:302,
“标题”:{
位置:重定向URL,
}
};

回调(空,响应)要使用lambda函数和api网关将某些结果重定向到其他uri,必须使用

var err=新错误(“HandlerDemo.ResponseFound重定向:在别处找到的资源”);
err.name=结果;
context.done(err,{});
在lambda函数中,它将转发错误 api网关上的和 `方法响应:> 将HTTP状态添加为302 302的响应头 添加位置


用于映射
集成响应
头映射
位置集成.response.body.errorType

这会奏效的


来自此url的积分

您实际要重定向到哪里?它是来自aws lambda的吗?@Andremoniy首页来自S3,这是一个表单。提交后,它通过API调用AWS Lambda函数,然后当API响应时,我想重定向到同一个bucket中的另一个html文件。我现在已经把这个问题孤立出来了。如果我将实际位置作为字符串放在{}中,重定向就可以工作。但是,如果我将JSON对象存储到一个变量中,并在回调中传递该变量,则重定向不起作用。它是否显示任何CORS问题?是的,我很有信心得到302的响应,因为显示的字符串beig是我想要重定向到的位置。如果我将该值存储到一个var中,然后将该变量作为回调的一部分传递,那么看起来它不起作用。如果我把它直接放在回拨中,它会工作…@user2517028是的。我正在生产中使用上述代码。它起作用了。如果需要帮助,请更具体地说明什么不起作用。我复制了与原样完全相同的代码,并且没有重定向到“Location”标题中指定的链接。浏览器收到的响应是在回调的第二个参数中指定的整个对象。我最终使用了这个:但我认为这不是完美的解决方案,因为我们无法控制响应(例如添加多个Header参数)如果您想借用现有的基础设施来检查您是否使用了Swagger 2.0或OpenAPI 3.0并进行相应的转换,最好记住这一点……您可以使用它来验证语法,这非常方便,因为我在尝试导入它时遇到了错误,结果发现它缺少几个必需的字段(我已经提交了一个更新请求,请求更新结果)。