我在App Engine应用程序中有两项不同的服务,分别称为auth和app。身份验证服务运行良好,图像,css,js和php均已正确提供和执行。首次启动App Engine应用程序时,auth服务也是我的默认服务。
我的问题是应用程序服务。最初,我得到的只是一堆太多的重定向错误,但后来我得以解决,但现在CSS JS或图像都无法由应用程序服务正确提供。实际提供的唯一CSS实际上是来自auth服务,没有提供JS,并且有来自auth服务的一张背景图片。同样,这是两个完全不同的事物,甚至存在于它们自己的自定义子域中。
此外,我的auth服务中的路由器也被用作我的应用程序服务的路由器。
我认为所有这些问题都与我的默认服务(我什至不应该再使用)有关,并干扰了我的应用程序服务(并且不会影响我的身份验证服务,因为它们是同一个问题)我认为涉及Google云端)。这是我的app.yaml。除了服务名称和路由器名称,这两个服务都相同:
runtime: php73
service: app
entrypoint: serve /approuter.php
handlers:
- url: /assets
static_dir: assets
# Serve static files as static resources.
- url: /(.+\.(gif|png|jpg|svg|webp|jpeg|js))$
static_files: \1
upload: .+\.(gif|png|jpg|svg|webp|jpeg|js)$
- url: /style
static_dir: style
- url: /js
static_dir: js
- url: /.*
script: auto
这是我的dispatch.yaml:
dispatch:
- url: "app.example.com/"
service: app
- url: "auth.example.com/"
service: auth
所以这最终是我的问题:
当涉及到不同的服务时,如何才能真正分离关注点? (即...没有默认服务会为我的应用程序服务提供所有服务)
答案 0 :(得分:0)
所以这个答案确实很容易,但是同样,它没有记录在任何地方,所以我想在这里给出一个非常深入的答案。
TLDR;答案如下(dispatch.yaml):
dispatch:
- url: "app.example.com/*"
service: app
- url: "auth.example.com/*"
service: auth
从字面上看,只是在每个路径的末尾添加一个*,不过让我们深入探讨它。
第一,请记住,我的默认服务是现在已成为“身份验证”服务的服务。这很快将很重要。
我认为每个人都知道这里发生了什么...域名后面的*
意味着它需要匹配指向该域的 any 网址。没有*
的情况是,该服务提供的唯一路径是我的根路径(或/
)。其他所有内容均由默认服务处理...。这使我们了解了为什么在我的应用程序服务中看到默认服务中的静态资产。
当App Engine遇到未由dispatch.yaml特别处理的网址(因此,除了app.example.com和auth.example.com的根目录以外的其他任何内容),它将“默认”为默认服务,如果您还记得,那是我的身份验证服务。这就是为什么我的身份验证服务似乎运行良好,而我的应用程序服务却有问题的原因。
最后,将星号添加到调度URL中,使应用程序引擎可以导航到正确的子文件夹。
答案 1 :(得分:0)
请记住,您的项目中仍然需要默认服务,请参见What purpose does the default service serve in Google's app engine。
我的建议是将您的app
服务设置为默认服务,并从dispatch.yaml
文件中删除相应的条目(不符合任何调度规则的请求将发送到默认服务)。不要忘记删除具有app
服务名称的现有部署。
亚当的答案也适用于auth
服务(您需要通配符)。从
Syntax:
提示:您可以在其中添加通配符,例如*通配符 url元素;但是,这些模式只能在 主机名和URL路径的末尾。
可以包含主机名和URL路径的URL模式。球状 字符可用于匹配模式。 Glob字符可以是 仅在图案的开头和结尾处指定。
auth
服务似乎运行良好,因为它实际上是由当前的默认服务(即其旧版本)提供的。您可以在开发者控制台Versions页中检查哪些版本和服务处于活动状态。