将 appid.appspot.com 重定向到应用引擎上托管的 Django App 的自定义域的最佳方法
Posted
技术标签:
【中文标题】将 appid.appspot.com 重定向到应用引擎上托管的 Django App 的自定义域的最佳方法【英文标题】:Best method to Redirect appid.appspot.com to custom domain for Django App hosted on app engine 【发布时间】:2019-09-08 01:47:57 【问题描述】:我提前向这个问题道歉,因为这个问题被问了很多次,但我找不到可以解决这个问题的 Django 特定解决方案。
说明:
Django:2.1 Python:3.7 应用宿主:谷歌应用引擎 域提供者: 谷歌域我有一个托管在谷歌应用引擎上的 Django 应用,其 URL 为 [id].appspot.com。我还注册了一个自定义域,例如谷歌域上的 www.example.com。我想将任何尝试访问 [id].appspot.com 的人重定向到 www.example.com 永久(301)。我的自定义域运行良好。
到目前为止,基于 google 和 *** 搜索,我发现了以下内容:
-
Add following canonical tag to each page
<link rel="canonical" href="https://www.example.com/" />
当多个域提供相同的内容时,这应该会通知搜索引擎您更喜欢哪个域。我已将此添加到我的站点标题中,但这似乎是一种解决方法。
-
Use check and redirect function:这篇文章为 webapp2 应用提供了一些很好的方法。然而,这是 10 年前的帖子,所以不确定这些解决方案中的任何一个是否可以直接工作或可能需要更改代码。
在答案“Alex Martelli”中建议检查 os.environ['HTTP_HOST'].endswith('.appspot.com') 并重定向。我不确定如何在应用程序引擎上托管的 Django 应用程序中完成它。
在同一篇文章中,还有另一种方法可以通过覆盖 webapp2.RequestHandler.initialize 来实现。但我再次认为它不适用于 Django。
我正在寻找 Django 特定的答案,无论是 app.yaml 或 dispatch.yaml 中类似于 blog post 的重定向设置还是 django 函数覆盖以从 [id].appspot.com 重定向到 www.example.com。
【问题讨论】:
【参考方案1】:app.yaml
或 dispatch.yaml
级别没有 URL 重定向功能。
你做的参考比较老,适用于GAE第一代标准环境,不是你的(你有python 3.7,所以要么是灵活环境,要么是第2代标准环境)
您需要处理应用程序内部的重定向,因此您只需要检查特定于 Django 的方法,从这个角度几乎忘记了 GAE。
我不是真正的 Django 用户,但我认为这些可能有用:
用于重定向:Django URL Redirect 对于规范标签:How to provide canonical URL with Django HttpResponseRedirect?【讨论】:
我会查看链接。顺便说一句,我使用的是第二代标准环境。【参考方案2】:最后我用下面的代码让它工作了,但是它需要大量的测试。
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
如果有人有任何建议,请告诉我。
【讨论】:
以上是关于将 appid.appspot.com 重定向到应用引擎上托管的 Django App 的自定义域的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 301 重定向而不是 302 将 HTTP 站点重定向到 HTTPS 站点
将 HTTP 重定向到 HTTPS(中间件重定向 vs Nginx)