首页 > 解决方案 > 将 appid.appspot.com 重定向到应用引擎上托管的 Django App 的自定义域的最佳方法

问题描述

我提前为提出这个问题道歉,因为它被问了很多次,但我找不到可以解决这个问题的 Django 特定解决方案。

描述:

我有一个 Django 应用程序托管在带有 [id].appspot.com url 的谷歌应用程序引擎上。我还在谷歌域上注册了一个自定义域,例如 www.example.com。我想将尝试访问 [id].appspot.com 的任何人重定向到 www.example.com 永久(301)。我的自定义域运行良好。

到目前为止,基于 google 和 stackoverflow 搜索,我发现了以下内容:

  1. 将以下规范标签添加到每个页面
<link rel="canonical" href="https://www.example.com/" />

当来自多个域的相同内容可用时,这应该通知搜索引擎您更喜欢哪个域。我已将此添加到我的站点标题中,但这似乎是一种解决方法。

  1. 使用检查和重定向功能:这篇文章为 webapp2 应用程序提供了一些很好的方法。然而,这是 10 年前的帖子,所以不确定这些解决方案中的任何一个是否可以直接工作或可能需要更改代码。

在答案“Alex Martelli”中建议检查 os.environ['HTTP_HOST'].endswith('.appspot.com') 并重定向。我不确定如何在应用程序引擎上托管的 Django 应用程序中完成它。

在同一篇文章中,还有另一种方法可以通过覆盖 webapp2.RequestHandler.initialize 来实现。但我再次认为它不适用于 Django。

我正在寻找 Django 特定的答案,无论是 app.yaml 或 dispatch.yaml 中类似于此博客文章的重定向设置还是 django 函数覆盖以从 [id].appspot.com 重定向到 www.example.com。

标签: djangopython-3.xgoogle-app-engine

解决方案


最后我让它使用以下代码,但是它需要广泛的测试。

    from django.http import HttpResponsePermanentRedirect
    from django.utils.deprecation import MiddlewareMixin

    SITE_DOMAIN = "www.example.com"

    class CanonicalDomainMiddleware(MiddlewareMixin):    
        response_redirect_class = HttpResponsePermanentRedirect

        def process_request(self, request):

            host = request.get_host()

            if host == 'id.appspot.com':
                redirect_url = ('%s://%s%s' % (request.scheme, 
SITE_DOMAIN,request.get_full_path()))
                return self.response_redirect_class(redirect_url)
            else:
                return

如果有人有任何建议,请告诉我。


推荐阅读