代码之家  ›  专栏  ›  技术社区  ›  qix

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

  •  6
  • qix  · 技术社区  · 9 年前

    我有一个GAE应用程序,它提供由yaml文件中的规则定义的静态文件,在DNS中配置了两个不同的域名,一个旧域名和一个新域名,但除此之外,每个域名都提供相同的内容。我想将请求从旧域重定向到新域。我见过 this question ,但据我所知,这将失去在yaml中使用静态资产处理程序的能力,并且必须在main中明确设置静态资产服务。我想。当主机名是旧域时,是否有一种简单的方法(最好是在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

    1 回复  |  直到 7 年前
        1
  •  5
  •   Dan Cornilescu    9 年前

    AFAIK您不能对静态资产进行重定向,因为GAE直接根据.yaml文件规则为它们提供服务,甚至不需要点击应用程序代码。

    你可以添加一个模块(我们称之为 重定向模块 例如)到您的应用程序,使用分派器文件将所有旧域URL路由到它,并使用此模块中的动态处理程序将URL重定向到新的域等效项,按照您所引用问题的答案中建议的行。新的域请求将继续工作,无论是作为静态资产还是应用程序的现有模块。这个 调度yaml 文件将如下所示:

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

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