7

我正在查看有关 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 灵活环境中使用 node.js,但我认为每种语言和环境都是一样的。

问题是这些页面并没有真正指定 dispatch.yaml 是如何工作的。尤其:

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

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

4

2 回答 2

7

到目前为止我知道的事情:

  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

于 2016-12-01T18:51:22.383 回答
1

只是为了填写空白(随时将其粘贴到接受的答案中):

  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我得到了“默认”

于 2018-10-12T09:53:36.537 回答