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

Posted

技术标签:

【中文标题】使用 Google App Engine 将所有请求从一个域重定向到另一个域,但在 yaml 中保留静态路由规则【英文标题】:redirect all requests from one domain to another with Google App Engine but keep static routing rules in yaml 【发布时间】:2015-12-16 18:37:27 【问题描述】:

我有一个 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

【问题讨论】:

这还能用吗?我无法让它在我的域上运行 @AlokKumar 你遇到了什么错误?从旧域请求 url 时,您是否没有获得预期的 http 状态代码,如果没有,您会看到什么? (看起来 webapp2 自从我最初写这篇文章以来已经更新,虽然没有明显的相关破损:github.com/GoogleCloudPlatform/webapp2/blob/master/CHANGES)或者您是否调查过这是否是 yaml 规则的问题?当然,谷歌本可以在过去 2 年改变它的处理方式。 我没有收到任何错误。我想要的是,如果有人键入 www 链接,它应该重定向到非 www 链接。我已经设置了同样的东西。你可以在这里查看cloudnowtech.com 我猜重定向模块正在工作,因为当我通过从 yaml 中删除重定向模块来部署新版本时,它只更新了默认实例并且 www 仍然显示旧版本。所以重定向模块有效,但我希望更改 URL 【参考方案1】:

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

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

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

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

【讨论】:

感谢您的建议!我不相信 DNS 路由对我有用,因为两者都需要支持 SSL,但感谢您确认我的怀疑以及如何解决此问题的示例。 我是 GAE 的新手,你能详细说明一下,在哪里写下这个重定向模块?我正在努力将我的 www 重定向到裸域。 @anshulix:你真的需要那个重定向吗? (不必要的额外重定向不是好事)。不只是将应用程序映射到 www 和裸域为您工作吗?见***.com/questions/34826320/… @Dan:我正在研究服务工作者,如果我的用户暴露在裸露和子域中,它会导致应用程序行为发生冲突。我想将 www 重定向到裸域或将所有裸域重定向到 www。 感谢您的链接,您的解决方案,我已经做到了。用户仍然可以同时使用 www 和裸 url。现在卡在这件事上太久了:(

以上是关于使用 Google App Engine 将所有请求从一个域重定向到另一个域,但在 yaml 中保留静态路由规则的主要内容,如果未能解决你的问题,请参考以下文章

使用 Google App Engine 签名的 Google Cloud Storage 网址

是否可以将 Google App Engine 与 Google Cloud *** 一起使用?

Google App Engine 通过内部网络与 Compute Engine 通信

使用 Google App Engine 发布订阅

在 Google App Engine 中使用 Cron 作业

使用 Google App Engine 和 Google Cloud SQL 扩展 WordPress