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 是如何工作的。特别是:
- 是否按照给定的顺序应用规则?我假设第一个匹配规则是使用的规则,但似乎没有这样说。
- 前导 glob(通配符)字符是否只匹配域名,或者它们是否可以匹配 URL 路径的第一部分?如果规则是
*/hello
,那会匹配 myapp.appspot.com/path/hello
吗?我猜不是,基于文档中的一些模糊提示,但不是很清楚。
- 如果 dispatch.yaml 中没有规则匹配 URL,它会被路由到默认服务吗?我认为它必须,但同样,这些页面没有说。
- URLs 在发送到服务之前会根据规则重写吗?如果规则是
*/path/*
而 URL 是 https://myapp.appspot.com/path/hello
,服务会将其视为 /path/hello
还是 /hello
?我猜是前者。
我现在正在试错,所以我可能很快就能回答我自己的问题。我还通过他们的文档反馈系统将此提交给 Google。
目前我知道的事情:
- 是的,规则是按顺序尝试的。因此,例如,如果您希望一个 URL 转到特定服务,而所有其他 URL 转到另一个服务,您应该首先指定具体的服务:
dispatch:
- url: "*/specific"
module: specific
- url: "*/*"
module: general
如果以相反的顺序放置这些规则,将永远不会使用模块 specific
,因为 URL /specific
将被通配符规则捕获。
未知
是的。您可以通过发出不匹配任何 dispatch.yaml
规则的请求并查看 default
的服务日志来测试这一点。
不重写。如果规则是 */path/*
而实际的 URL 是 https://myapp.appspot.com/path/hello
,您的服务应该仍然处理 /path/hello
,而不是 /hello
。
只是为了填空(请随意将其粘贴到已接受的答案中):
- 没有。它只匹配路径的开头。
我使用以下资源创建了两个应用程序:
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"
我正在查看有关 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 是如何工作的。特别是:
- 是否按照给定的顺序应用规则?我假设第一个匹配规则是使用的规则,但似乎没有这样说。
- 前导 glob(通配符)字符是否只匹配域名,或者它们是否可以匹配 URL 路径的第一部分?如果规则是
*/hello
,那会匹配myapp.appspot.com/path/hello
吗?我猜不是,基于文档中的一些模糊提示,但不是很清楚。 - 如果 dispatch.yaml 中没有规则匹配 URL,它会被路由到默认服务吗?我认为它必须,但同样,这些页面没有说。
- URLs 在发送到服务之前会根据规则重写吗?如果规则是
*/path/*
而 URL 是https://myapp.appspot.com/path/hello
,服务会将其视为/path/hello
还是/hello
?我猜是前者。
我现在正在试错,所以我可能很快就能回答我自己的问题。我还通过他们的文档反馈系统将此提交给 Google。
目前我知道的事情:
- 是的,规则是按顺序尝试的。因此,例如,如果您希望一个 URL 转到特定服务,而所有其他 URL 转到另一个服务,您应该首先指定具体的服务:
dispatch:
- url: "*/specific"
module: specific
- url: "*/*"
module: general
如果以相反的顺序放置这些规则,将永远不会使用模块 specific
,因为 URL /specific
将被通配符规则捕获。
未知
是的。您可以通过发出不匹配任何
dispatch.yaml
规则的请求并查看default
的服务日志来测试这一点。不重写。如果规则是
*/path/*
而实际的 URL 是https://myapp.appspot.com/path/hello
,您的服务应该仍然处理/path/hello
,而不是/hello
。
只是为了填空(请随意将其粘贴到已接受的答案中):
- 没有。它只匹配路径的开头。
我使用以下资源创建了两个应用程序:
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"