将所有针对www的请求转发到根域名

3
我需要将所有从www.mysite.com发出的请求重定向到mysite.com。我已经在Rails中找到了解决方案,但是在Django / Python中该怎么做呢?我能找到的唯一解决办法是来自GoDaddy的管理员发布的上述方法。似乎我无法通过GoDaddy的DNS管理器解决此类问题。
2个回答

10

您可以在[PROJECT_NAME]/middleware.py中创建自己的中间件,方法如下:

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


class RemoveWWWMiddleware(MiddlewareMixin):
    """
    Based on the REMOVE_WWW setting, this middleware removes "www." from the
    start of any URLs.
    """
    def process_request(self, request):
        host = request.get_host()
        if settings.REMOVE_WWW and host and host.startswith('www.'):
            redirect_url = '%s://%s%s' % (
                request.scheme, host[4:], request.get_full_path()
            )
            return HttpResponsePermanentRedirect(redirect_url)

然后,在您的项目的settings.py中:

  • 添加REMOVE_WWW = True
  • 并在Django的SecurityMiddleware之后、Django的Common Middleware之前的MIDDLEWARE列表中添加[PROJECT_NAME].middleware.RemoveWWWMiddleware
  • 当然,还要确保您没有设置PREPEND_WWW = True

这个中间件基于Django的CommonMiddleware


2
这应该是被接受的答案 - 我可以确认这个解决方案与Django == 2.0.2完美地配合使用。非常感谢,Jeff!我在从DNS方面做这件事时遇到了麻烦。 - Jihoon Baek

0

解决方案如下:

from django.http import HttpResponsePermanentRedirect

class WWWRedirectMiddleware(object):
    def process_request(self, request):
        if request.META['HTTP_HOST'].startswith('www.'):
            return HttpResponsePermanentRedirect('http://example.com')

如果你同时运行本地开发服务器,那么你该如何使用它呢? - Alper
1
@alper 例如使用 if not DEBUG。 - 1ronmat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接