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

Mapping subdomain to a service in Google App Engine project

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

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

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

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

示例:如果我拥有 example.com

我希望 example.comweb_server.app 提供服务,api.example.comrest_server.app

提供服务

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

示例:

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

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

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

您可以通过将您的应用程序拆分为 2 个单独的 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 文件中,您只需要非默认模块的路由,没有路由匹配的请求默认路由到默认模块:

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

您可以在此处找到更完整的示例:

然后将 example.com 裸域 api.example.com 子域 映射到您的应用。关注Adding a custom domain for your application procedure, paying extra attention to the sections which are slightly different when configuring a naked domain vs a subdomain. See also

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

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

可能并非在所有情况下或对所有应用程序都是可行的。例如,如果应用使用自动生成的 URLs.

发出跨模块请求,这就是一个问题

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

module: rest

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

然后您可以添加一个 dispatch.yaml 规则,该规则不是基于主机的,也适用于本地开发服务器。这可以永久保留在那里,当临时 rest.yaml 更改被撤销时,它不会伤害 if/when 在生产中部署:

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