AWS API Gateway未正确反向代理

时间:2017-01-27 11:01:20

标签: amazon-web-services proxy reverse-proxy aws-api-gateway

我正在尝试使用AWS API Gateway作为反向HTTP代理来展示部署为弹性beanstalk应用程序的几个原型Web应用程序:

配置

每个EB应用程序都在其应用程序名称下的API网关中映射,例如

/hello1 (API Gateway mapping) --> prototype1 EB application 
/hello2 (API Gateway mapping) --> prototype2 EB application
... etc

这是我创建的整体映射:

enter image description here

似乎API Gateway在每个映射中处理对根资源的请求,例如'/'与子资源请求不同,因此我为两者设置了代理映射:

root('/')资源是一个直接(即非贪婪)代理映射:

Root '/' resource proxy mapping

然后根据根上下文中的任何内容都有一个贪婪的代理映射:

Greedy proxy mapping under the root context

然后我将API部署到名为“master”的阶段

想要访问每个原型,我会获取网址http://protos.acme.com/<stage>/<proto_name>,例如http://protos.acme.com/master/hello1

问题

我发现如果我在URL中添加一个尾部斜杠,或者指定一个特定的资源,例如index.html然后一切都很完美,例如。

但是如果我省略了URL中的尾部斜杠,例如http://protos.acme.com/master/hello1然后由API Gateway完成的URL重写停止工作,代理内容中的任何URL都不再正确解析,因为它们省略了原型名称,例如http://protos.acme.com/master/index.html

我找不到任何方法来配置省略尾部斜杠时的行为,我认为强制我的用户始终记住尾部斜杠是不可接受的。

感谢任何见解!

Edd

2 个答案:

答案 0 :(得分:2)

我设置了一个快速测试,除了GET ANY路径之外,如果我在资源根路径上明确定义了{proxy+}方法,它似乎也能正常工作。

api gateway proxy integration

答案 1 :(得分:0)

我遇到了同样的问题,正在使用具有自定义域和aws-serverless-proxy的AWS API网关来处理node.js后端中的api。

如果我的自定义域网址-https://host.com,基本路径-测试, 然后通过代理集成,有效的可访问网址-https://host.com/test/(带斜杠)

因此,如果传入的请求URL不以'/'结尾,我将在后端重定向URL。

示例代码:读取传入的请求并将响应重定向到相同的url,但在末尾添加斜杠。

let requestUrl = req.url;
    if (requestUrl !== undefined && !(requestUrl.endsWith('/'))) {
        res.writeHead(302, { 'Location': `${req.url}/` });
        res.end();
    }