将子域映射到Google App Engine项目中的服务

时间:2016-11-23 04:51:26

标签: google-app-engine subdomain google-domain-api

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

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

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

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

示例:如果我拥有example.com

我希望example.comweb_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

1 个答案:

答案 0 :(得分:8)

app.yaml中的请求路由不能用于根据URL的域名进行路由,请参阅Handlers element doc部分中的url表行。

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

您可以将应用分成两个单独的services/modules,每个处理一个脚本,从而获得您想要的效果。其中一个模块必须是默认模块,我将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文件中,您只需要非默认模块的路由,默认情况下,匹配无路由的请求将路由到defaut模块:

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

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

然后,您可以将example.com 裸域api.example.com 子域映射到您的应用。遵循Adding a custom domain for your application过程,在配置裸域与子域时,要特别注意略有不同的部分。另请参阅https://stackoverflow.com/a/36317462/4495081

有一个问题,基于主机名的tho - dispatch.yaml路由不能与本地开发服务器一起使用,发往rest模块的请求实际上会去到default模块。

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

在所有情况下或所有应用中都无法使用 。例如,如果应用程序使用自动生成的URL发出跨模块请求,则会出现问题。

在这种情况下,为了解决这个问题,你可以暂时在rest.yaml URL中插入一个小路径部分,只有在本地开发服务器上测试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