如何在Django下将domain.com重定向到WWW.domain.com?

时间:2010-02-18 02:22:30

标签: django apache mod-wsgi http-status-code-301

如何将所有对domain.com / ...的请求重定向到 www .domain.com / ...并在django网站上使用301?

显然这不能在urls.py中完成,因为你只能在那里获得URL的路径部分。

我不能在.htaccess中使用mod重写,因为.htaccess文件在Django下没有任何作用(我认为)。

我猜中间件或apache conf中有什么东西?

我正在使用mod WSGI

在Plesk的Linux服务器上运行Django

6 个答案:

答案 0 :(得分:18)

某人指出的WebFaction讨论对于配置是正确的,你只需要自己应用它而不是通过控制面板。

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example.com$
RewriteRule (.*) http://www.example.com/$1 [R=301,L]

放入.htaccess文件,或在适当的上下文中的主Apache配置中。如果在主Apache配置中的VirtualHost内,您将ServerName为www.example.com,ServerAlias为example.com,以确保虚拟主机处理这两个请求。

如果您无权访问任何Apache配置,如果需要,可以使用围绕Django WSGI应用程序入口点的WSGI包装器来完成。类似的东西:

import django.core.handlers.wsgi
_application = django.core.handlers.wsgi.WSGIHandler()

def application(environ, start_response):
  if environ['HTTP_HOST'] != 'www.example.com':
    start_response('301 Redirect', [('Location', 'http://www.example.com/'),])
    return []
  return _application(environ, start_response)

修复此问题以在网站中包含URL并处理https是留给读者的练习。 : - )

答案 1 :(得分:15)

PREPEND_WWW设置就是这样。

答案 2 :(得分:3)

a lightweight way to do that涉及VirtualHosts和mod_alias Redirect directive。您可以定义两个VirtualHost,一个持有重定向,另一个持有site configuration

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / http://www.example.com/
</VirtualHost>

<VirtualHost *:80>
    ServerName www.example.com
    # real site configuration
</VirtualHost>

这将完成这项工作。

答案 3 :(得分:0)

此处存在关于此问题的完整主题http://forum.webfaction.com/viewtopic.php?id=1516

答案 4 :(得分:0)

这也可以用中间件完成。

一些例子:

这是一个更好的snippet-510版本:

class UrlRedirectMiddleware(object):
    """
    This middleware lets you match a specific url and redirect the request to a
    new url. You keep a tuple of (regex pattern, redirect) tuples on your site
    settings, example:

    URL_REDIRECTS = (
        (r'(https?)://(www\.)?sample\.com/(.*)$', r'\1://example.com/\3'),
    )
    """
    def process_request(self, request):
        full_url = request.build_absolute_uri()
        for url_pattern, redirect in settings.URL_REDIRECTS:
            match = re.match(url_pattern, full_url)
            if match:
                return HttpResponsePermanentRedirect(match.expand(redirect))

答案 5 :(得分:0)

我已经尝试过格雷厄姆的解决方案,但无法让它工作(即使最简单的情况是http(而不是https)没有任何路径。我对wsgi没有经验,因为你可以猜到并且所有帮助都是深刻的赞赏。

这是我的尝试(从www.olddomain.com重定向到www.newdomain.com)。当我尝试部署它时,尝试访问www.olddomain.com会导致错误(“无法访问此页面”):

from django.core.wsgi import get_wsgi_application

_application = get_wsgi_application()

def application(environ, start_response):
  if environ['HTTP_HOST'][:21] == 'www.olddomain.com':
    start_response('301 Redirect', [('Location', 'http://www.newdomain.com/'),])
  return []

  return _application(environ, start_response)

感谢您的帮助