8

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

显然,这不能在 urls.py 中完成,因为您只能在其中获取 URL 的路径部分。

我不能在 .htaccess 中使用 mod rewrite,因为 .htaccess 文件在 Django 下什么都不做(我认为)。

我在猜测中间件或 apache conf 中的某些内容?

我使用 mod WSGI 在带有 Plesk 的 Linux 服务器上运行 Django

4

4 回答 4

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 留给读者作为练习。:-)

于 2010-02-18T03:05:50.117 回答
15

PREPEND_WWW设置就是这样做的

于 2010-02-18T03:12:47.567 回答
4

有一种涉及VirtualHosts和 mod_alias重定向指令的轻量级方法。您可以定义两个 VirtualHost,一个保存重定向,另一个保存站点配置

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

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

这将完成这项工作。

于 2015-12-04T15:06:30.753 回答
1

这也可以通过中间件来完成。

一些例子:

这是一个更好的片段 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))
于 2015-04-19T13:44:27.260 回答