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

use*_*455 4 subdomain google-app-engine google-domain-api

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

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

- url: /api/.*
  script: rest_server.app
Run Code Online (Sandbox Code Playgroud)

如何确保我拥有的域的子域由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
Run Code Online (Sandbox Code Playgroud)

Dan*_*scu 8

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

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

您可以通过将应用程序拆分为两个单独的服务/模块来获得您的需求,每个服务/模块处理一个脚本.其中一个模块必须是默认模块,我将其作为默认模块web.一个dispatch.yaml文件将被用于将请求路由到基于URL主机各自的模块.

web.yaml文件将包含:

module: default

handlers:
- url: /.*
  script: web_server.app
Run Code Online (Sandbox Code Playgroud)

rest.yaml文件将包含:

module: rest

handlers:
- url: /.*
  script: rest_server.app
Run Code Online (Sandbox Code Playgroud)

dispatch.yaml文件中,您只需要非默认模块的路由,默认情况下,匹配无路由的请求将路由到defaut模块:

- url: "api.example.com/*"
  module: rest
Run Code Online (Sandbox Code Playgroud)

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

然后,您可以将example.com 裸域api.example.com 子域映射到您的应用.按照为应用程序添加自定义域的过程,在配置裸域与子域时要特别注意略有不同的部分.另请参见/sf/answers/2542222371/

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

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

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

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

module: rest

handlers:
- url: /api/.*
  script: rest_server.app
Run Code Online (Sandbox Code Playgroud)

然后,您可以添加一个dispatch.yaml非基于主机的规则,也可以添加本地开发服务器.这可以永久保留在那里,当临时rest.yaml更改被逆转时,如果/在生产中部署时不会受到影响:

- url: "api.example.com/*"
  module: rest
- url: "*/api/*"
  module: rest
Run Code Online (Sandbox Code Playgroud)