中的请求路由app.yaml
不能用于基于 URL 的域名进行路由,请参见Handlers 元素文档部分url
中的表格行。
因此,您不能真正让一个模块/服务为您的应用程序提供服务,同时剥离您当前在处理程序配置中使用的 URL 的文件路径部分,url
以将请求路由到一个脚本或另一个。
您可以通过将应用程序拆分为 2 个单独的服务/模块来获得所需的内容,每个服务/模块处理一个脚本。其中一个模块必须是默认模块,我将其设为默认模块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
您可以在此处找到更完整的示例:https ://stackoverflow.com/a/34111170/4495081
然后,您将example.com
裸域和api.example.com
子域都映射到您的应用程序。遵循为您的应用程序添加自定义域的过程,特别注意配置裸域与子域时略有不同的部分。另请参阅https://stackoverflow.com/a/36317462/4495081
有一个问题,dispatch.yaml
尽管基于主机名的路由不适用于本地开发服务器,但发往rest
模块的请求实际上会转到default
模块。
一个更简单的解决方法是将rest
模块客户端定向到本地开发服务器模块侦听的实际 localhost:PORT URL rest
(在开发服务器启动时显示在终端中)。
这可能不适用于所有情况或所有应用程序。例如,如果应用程序使用自动生成的 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