我有一个包含以下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
答案 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