【发布时间】:2020-03-25 06:18:27
【问题描述】:
我正在尝试将一个域的所有流量重定向到另一个域。我没有专门为这项工作运行服务器,而是尝试使用带有 lambda 的 AWS API Gateway 来执行重定向。
我的根路径“/”可以正常工作,但是对子路径的任何请求,例如/a 不处理。有没有办法定义“包罗万象”的资源或通配符路径处理程序?
【问题讨论】:
标签: aws-api-gateway
我正在尝试将一个域的所有流量重定向到另一个域。我没有专门为这项工作运行服务器,而是尝试使用带有 lambda 的 AWS API Gateway 来执行重定向。
我的根路径“/”可以正常工作,但是对子路径的任何请求,例如/a 不处理。有没有办法定义“包罗万象”的资源或通配符路径处理程序?
【问题讨论】:
标签: aws-api-gateway
从上周开始,API Gateway 现在支持他们所谓的“Catch-all Path Variables”。
这里有完整的细节和演练:API Gateway Update – New Features Simplify API Development
【讨论】:
您可以使用/{thepath+} 之类的路径创建资源。加号很重要。
然后在您的 lambda 函数中,您可以同时访问该值
event.path - 始终包含完整路径event.pathParameters.thepath - 包含您定义的部分。其他可能的用例:定义 /images/{imagepath+} 之类的资源以仅匹配具有特定前缀的路径。该变量将仅包含子路径。您可以调试所有传递给您的函数的值:JSON.stringify(event)
【讨论】:
Resource's path part only allow a-zA-Z0-9._- and curly braces at the beginning and the end.。
/ 不匹配。
/和/images)
serverless-offline 将event.resource 中的+ 更改为*,即它变成/{thepath*} 而不是/{thepath+}(YML 文件语法)。因此,如果您有一些依赖于 event.resource 的 JS 级逻辑,则需要对其进行规范化,以使逻辑以与无服务器离线和真实 AWS 相同的方式工作。
更新:从上周开始,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 网关变得更加复杂。但是,它也确实限制了 API 网关,并且要处理这种情况,您最终会得到一个更加混乱的配置。
所以,你可以在这里走很长的路。为多个资源创建相同的方法并执行以下操作:/{1}/{2}/{3}/{4}/{5}/{6}/{7} 等等。然后,如果需要,您可以处理每个路径参数级别。
如果参数个数总是一样,那你就比较幸运了,只需要设置一堆资源,但最后一个方法。
来源:https://forums.aws.amazon.com/thread.jspa?messageID=689700򨘤
【讨论】:
ANY 请求和 /{proxy+} - 不仅仅是通配符路径,还支持通配符 HTTP 方法 \o/
与 AWS 最近引入的 HTTPAPI 相关,$default 用作通配符,用于捕获与定义的模式不匹配的所有路由。
更多详情请参考:aws blogs
【讨论】:
/{any}+ 的答案不同,这也将匹配/。但是,我发现上面的链接实际上并没有解释这个事实。更好的参考在这里:docs.aws.amazon.com/apigateway/latest/developerguide/…
您可以使用路径变量/{param} 创建资源,并且可以将其视为通配符路径处理程序。
谢谢, - 家侯
【讨论】:
/{param} 定义资源将不会处理嵌套路径。例如。 /something 将匹配,但 /something/else 将不匹配资源 /{param}