dispatch.yaml 的语义

Semantics of dispatch.yaml

我正在查看有关 dispatch.yaml 的各种页面,其中大部分包含类似的信息和示例:

https://cloud.google.com/appengine/docs/flexible/nodejs/how-requests-are-routed#routing_with_a_dispatch_file https://cloud.google.com/appengine/docs/python/config/dispatchref https://cloud.google.com/appengine/docs/go/config/dispatchref 等等

我碰巧在 GAE Flexible Environment 上使用 node.js,但我认为它对每种语言和环境都是一样的。

问题是这些页面并没有真正说明 dispatch.yaml 是如何工作的。特别是:

  1. 是否按照给定的顺序应用规则?我假设第一个匹配规则是使用的规则,但似乎没有这样说。
  2. 前导 glob(通配符)字符是否只匹配域名,或者它们是否可以匹配 URL 路径的第一部分?如果规则是 */hello,那会匹配 myapp.appspot.com/path/hello 吗?我猜不是,基于文档中的一些模糊提示,但不是很清楚。
  3. 如果 dispatch.yaml 中没有规则匹配 URL,它会被路由到默认服务吗?我认为它必须,但同样,这些页面没有说。
  4. URLs 在发送到服务之前会根据规则重写吗?如果规则是 */path/* 而 URL 是 https://myapp.appspot.com/path/hello,服务会将其视为 /path/hello 还是 /hello?我猜是前者。

我现在正在试错,所以我可能很快就能回答我自己的问题。我还通过他们的文档反馈系统将此提交给 Google。

目前我知道的事情:

  1. 是的,规则是按顺序尝试的。因此,例如,如果您希望一个 URL 转到特定服务,而所有其他 URL 转到另一个服务,您应该首先指定具体的服务:
dispatch:
  - url: "*/specific"
    module: specific

  - url: "*/*"
    module: general

如果以相反的顺序放置这些规则,将永远不会使用模块 specific,因为 URL /specific 将被通配符规则捕获。

  1. 未知

  2. 是的。您可以通过发出不匹配任何 dispatch.yaml 规则的请求并查看 default 的服务日志来测试这一点。

  3. 不重写。如果规则是 */path/* 而实际的 URL 是 https://myapp.appspot.com/path/hello,您的服务应该仍然处理 /path/hello,而不是 /hello

只是为了填空(请随意将其粘贴到已接受的答案中):

  1. 没有。它只匹配路径的开头。

我使用以下资源创建了两个应用程序:

default -> /abc/def/test.html -> <h1>default</h1>
other -> /abc/def/test.html -> <h1>other</h1>

还有 1 条路线:

<dispatch>
  <url>*/def/*</url>
  <module>other</module>
</dispatch>

当我点击 {app engine}/abc/def/test.html 我得到了 "default"