4

我有一个带有以下 yaml 文件的 Google App Engine 项目

handlers:
- url: /web/.*
  script: web_server.app

- url: /api/.*
  script: rest_server.app

如何确保我拥有的域的子域由 rest_server.app 脚本提供服务。

示例:如果我拥有 example.com

我想example.com被服务web_server.app,并且api.example.com被服务rest_server.app

是否可以使用 Google App Engine 做到这一点。

例子:

handlers:
- url: example.com/.*
  script: web_server.app
- url: api.example.com/.*
  script: rest_server.app
4

1 回答 1

8

中的请求路由app.yaml不能用于基于 URL 的域名进行路由,请参见Handlers 元素文档部分url中的表格行。

因此,您不能真正让一个模块/服务为您的应用程序提供服务,同时剥离您当前在处理程序配置中使用的 URL 的文件路径部分,url以将请求路由到一个脚本或另一个。

您可以通过将应用程序拆分为 2 个单独的服务/模块来获得所需的内容,每个服务/模块处理一个脚本。其中一个模块必须是默认模块,我将其设为默认模块web。一个dispatch.yaml文件将用于根据 URL 主机名将请求路由到它们各自的模块。

web.yaml文件将包含:

module: default

handlers:
- url: /.*
  script: web_server.app

rest.yaml文件将包含:

module: rest

handlers:
- url: /.*
  script: rest_server.app

dispatch.yaml文件中,您只需要非默认模块的路由,不匹配路由的请求默认路由到默认模块:

- url: "api.example.com/*"
  module: rest

您可以在此处找到更完整的示例:https ://stackoverflow.com/a/34111170/4495081

然后,您将example.com 裸域api.example.com 子域都映射到您的应用程序。遵循为您的应用程序添加自定义域的过程,特别注意配置裸域与子域时略有不同的部分。另请参阅https://stackoverflow.com/a/36317462/4495081

有一个问题dispatch.yaml尽管基于主机名的路由不适用于本地开发服务器,但发往rest模块的请求实际上会转到default模块。

一个更简单的解决方法是将rest模块客户端定向到本地开发服务器模块侦听的实际 localhost:PORT URL rest(在开发服务器启动时显示在终端中)。

可能不适用于所有情况或所有应用程序。例如,如果应用程序使用自动生成的 URL 发出跨模块请求,就会出现问题。

在这种情况下,要解决它,您可以临时在rest.yamlURL 中插入一个小路径部分,仅在本地开发服务器上测试rest模块期间(您需要在客户端和/或跨模块 URL 生成匹配更改逻辑):

module: rest

handlers:
- url: /api/.*
  script: rest_server.app

然后您可以添加一个dispatch.yaml不基于主机的规则,并且还可以与本地开发服务器一起使用。rest.yaml这可以永久保留在那里,如果/在生产中部署时,当临时更改被撤销时,它不会受到伤害:

- url: "api.example.com/*"
  module: rest
- url: "*/api/*"
  module: rest
于 2016-11-23T15:25:39.840 回答