使用 Google App Engine 将所有请求从一个域重定向到另一个域,但在 yaml 中保留静态路由规则

redirect all requests from one domain to another with Google App Engine but keep static routing rules in yaml

我有一个 GAE 应用程序提供由 yaml 文件中的规则定义的静态文件,这些文件位于 DNS 中配置的两个不同域名下,一个旧域名和一个新域名,但除此之外,它们为每个域名提供的内容相同。我想将请求从旧域重定向到新域。我已经看到 this question,但据我所知,它失去了在 yaml 中使用静态资产处理程序的能力,并且我认为必须在我的 main.py 中明确设置静态资产服务。当主机名是旧域时,是否有一种简单的方法(最好在 yaml 文件本身中)进行重定向,但为新域保留我的静态文件规则?

更新

这是我最终使用的完整解决方案:

### dispatch.yaml ###

dispatch:
- url: "*my.domain/*"
  module: redirect-module

### redirector.yaml ###

module: redirect-module
runtime: python27
threadsafe: true
api_version: 1

skip_files:
- ^(?!redirector.py$)

handlers:
# Redirect everything via our redirector
- url: /.*
  script: redirector.app

### redirector.py ###

import webapp2

def get_redirect_uri(handler, *args, **kwargs):
    return 'https://my.domain/' + kwargs.get('path')

app = webapp2.WSGIApplication([
    webapp2.Route('/<path:.*>', webapp2.RedirectHandler, defaults={'_uri': get_redirect_uri}),
], debug=False)

一些额外的文档: https://cloud.google.com/appengine/docs/python/modules/routing#routing_with_a_dispatch_file

据我所知,您无法对静态资产进行重定向,因为 GAE 直接根据 .yaml 文件规则为它们提供服务,甚至没有访问您的应用程序代码。

您可以向您的应用程序添加一个模块(例如,我们称之为 redirect-module),使用调度程序文件将所有旧域 URL 路由到它并使用动态处理程序在此模块中,按照您引用的问题的答案中建议的行,将 URL 重定向到新的域等效项。新的域请求将继续不加修改地工作,作为静态资产或应用程序的现有模块提供服务。 dispatch.yaml 文件如下所示:

application: your-app-name
dispatch:
  - url: "your.old.domain.com/*"
    module: redirect-module

想到的另一个想法(我实际上并没有这样做,所以我不确定它是否能解决您的问题)是完全避免重定向,而不是将您的应用映射到 2 个不同的域映射只到新域并使旧域成为新域的 DNS CNAME/alias。