将子域映射到 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.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
app.yaml
中的请求路由不能用于基于URL的域名进行路由,参见url
table行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
我有一个 Google App Engine 项目,其中包含以下 yaml 文件
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
app.yaml
中的请求路由不能用于基于URL的域名进行路由,参见url
table行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