Google App Engine 服务提供默认文件

Google App Engine service serving the default files

我的 App Engine 应用程序中有两种不同的服务,分别称为 auth 和 app。身份验证服务工作得很好,图像、css、js 和 php 都得到了正确的服务和执行。当我第一次启动 App Engine 应用程序时,身份验证服务也是我的默认服务。

我的问题是应用服务。起初我得到的只是一堆太多的重定向错误,但后来我能够解决这个问题,但是现在 CSS JS 的 none,或者图像正在由应用程序正确提供服务。唯一提供的 CSS 实际上来自 auth 服务,没有提供 JS,只有一张来自 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: 
  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

所以这最终是我的问题:
当涉及到不同的服务时,我如何才能真正分离关注点? (即...没有默认服务为我的应用程序服务提供所有服务)

所以这个答案真的很简单,但是同样,它没有任何地方记录,所以我想在这里给出一个非常深入的答案。

TLDR;答案如下 (dispatch.yaml):

dispatch:

  - url: "app.example.com/*"
    service: app

  - url: "auth.example.com/*"
    service: auth

实际上只是在每条路径的末尾添加一个 *...不过让我们深入探讨一下。

FIRST 请记住,我的默认服务是现在已成为 "auth" 服务的内容。这很快就会很重要。

我想大家都明白这是怎么回事了...域名后面的*表示需要匹配any url那个点到那个域。没有 * 的情况是服务提供的唯一路径是我的根路径(或 /)。其他一切都由默认服务处理....这让我们明白了为什么我在我的应用程序服务中看到来自默认服务的静态资产。

当 App Engine 遇到 dispatch.yaml 未专门处理的 URL 时(因此除了 app.example.com 和 auth.example.com 的根之外的任何内容)它会"default" 到默认服务,如果您还记得的话,这是我的身份验证服务。这就是为什么我的身份验证服务看起来运行良好,而我的应用程序服务出现问题的原因。

因此,总而言之,将星标添加到调度 URLs 允许应用引擎导航到正确的子文件夹。

请记住,您的项目中仍然需要默认服务,请参阅

我的建议是将您的 app 服务设为默认服务,并从 dispatch.yaml 文件中删除相应的条目(不匹配任何调度规则的请求将被发送到默认服务)。不要忘记删除具有 app 服务名称的现有部署。

Adam 的回答也适用于 auth 服务(您需要使用通配符)。从 Syntax:

Tip: You can include glob patterns like the * wildcard character in the url element; however, those patterns can be used only before the host name and at the end of the URL path.

A URL pattern that can include the hostname and URL path. Glob characters can be used to match patterns. The Glob characters can be specified only at the beginning of the pattern and end of the pattern.

可能 auth 服务看起来 运行 没问题,因为它实际上由当前默认服务(即它的旧版本)提供服务。您可以在开发者控制台 Versions 页面中查看哪些版本和服务处于活动状态。