AWS API Gateway可以使用通配符或者catch-all路径吗?

45

我正在尝试将一个域名的所有流量重定向到另一个域名。我不想专门为此工作运行服务器,而是尝试使用 AWS API Gateway 和 Lambda 执行重定向。

我已经成功地将根路径“/”重定向了,但任何子路径(例如 /a)的请求都没有被处理。是否有一种定义“catch all”资源或通配符路径处理程序的方法?

5个回答

37

2
如果您仍在2018年寻找此答案,请查看@geekQ的答案(https://dev59.com/-1sV5IYBdhLWcg3wzBc7#40608247),因为现在可以使用真正的全匹配(匹配/a/b/c/d/...)。 - Viccari
有用的博客文章,介绍如何使用CloudFormation设置catch-all https://cjohansen.no/aws-apigw-proxy-cloudformation/ - linqu

29
您可以创建一个路径为/{thepath+}的资源。加号很重要。
然后在您的lambda函数中,您可以通过以下两种方式访问该值:
  • event.path - 始终包含完整路径
  • event.pathParameters.thepath - 包含您定义的部分。其他可能的用例:像/images/{imagepath+}这样定义资源,仅匹配具有特定前缀的路径。变量仅包含子路径。
您可以使用JSON.stringify(event)调试传递给函数的所有值。 全文档

5
对我来说这行不通 - 当我尝试更新资源时,我会得到资源路径只允许使用a-zA-Z0-9._-和花括号开头和结尾。的错误提示。 - scubbo
1
这似乎也不匹配基本URL / - Migwell
如果您想匹配没有通配符参数的路径,则需要为它们定义单独的处理程序(在上面的示例中,例如 //images)。 - jakub.g
顺带一提: serverless-offline 似乎会在 event.resource 中将+更改为*,即它会将其更改为 /{thepath*} 而不是 /{thepath+}(YML 文件语法)。 因此,如果您的某些 JS 级别逻辑依赖于 event.resource,则需要对其进行规范化,以便在 serverless-offline 和真正的 AWS 上具有相同的工作逻辑。 - jakub.g

9
更新:截至上周,API Gateway 现在支持他们所谓的“Catch-all Path Variables”。请参见API Gateway Update – New Features Simplify API Development
不幸的是,您需要为每个级别创建一个资源。原因是 API Gateway 允许您通过对象访问这些参数。 例如:method.request.path.XXXX 因此,如果您只使用/{param},则可以使用method.request.path.param访问该参数,但如果您有嵌套路径(带有斜杠的参数),它将无法正常工作。您还将收到整个请求的404错误。
如果method.request.path.param是一个数组...那么当未命名时,它可以按位置获取参数。例如method.request.path.param[]...命名参数甚至可以在其中处理,但访问它们并不容易。它需要使用某种 JSON 路径映射(类似于您可以使用其映射模板执行的操作)。遗憾的是,这不是 API Gateway 的处理方式。
我认为这样做还好,因为这可能会使配置 API Gateway 更加复杂。但是,它也限制了 API Gateway,为了处理这种情况,您最终将以更令人困惑的配置结束。
因此,您可以走捷径。为多个资源创建相同的方法,然后执行以下操作:/{1}/{2}/{3}/{4}/{5}/{6}/{7}等等。然后,如果需要,您可以处理每个路径参数级别。
如果参数数量始终相同,则您会更加幸运,并且只需要设置一堆资源,但在最后设置一个方法即可。
来源:https://forums.aws.amazon.com/thread.jspa?messageID=689700&#689700

2
截至上周,API Gateway 现在支持他们所谓的“Catch-all Path Variables”:https://aws.amazon.com/blogs/aws/api-gateway-update-new-features-simplify-api-development/ - Avi Flax
2
现在您还可以使用 ANY 请求和 /{proxy+} - 不仅仅是通配符路径,而且还支持通配符 HTTP 方法 \o/ - Tom

8

最近AWS推出的HTTPAPI与之相关,$default用作通配符来捕获未匹配定义模式的所有路由。

更多详情请参见:AWS博客


2
这是正确的。与 /{any}+ 的答案不同,它也将匹配 /。然而,我并没有发现上面的链接实际上解释了这个事实。更好的参考资料在这里:https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-routes.html#http-api-develop-routes.default - Migwell

1
你可以使用路径变量/{param}创建一个资源,你可以将其视为通配符路径处理程序。
谢谢, - Ka Hou

谢谢,你知道这个是否适用于嵌套路径吗?例如,如果我使用/{param},它会匹配/a,但我不确定它是否会匹配/a/b/c?由于我正在尝试重定向所有流量,所以最好能够说/*或等效的内容。 - David
1
定义 /{param} 资源将无法处理嵌套路径。例如,/something 将匹配,但 /something/else 不会匹配资源 /{param} - Joe B
1
这是正确的。API网关目前不支持多级路径。 - Ka Hou Ieong
1
@DavidGoate 你可以使用贪婪模式 {param+} 来匹配所有子资源。 - pabombs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接