【问题标题】:How do I redirect domain.com to WWW.domain.com under Django?如何在 Django 下将 domain.com 重定向到 WWW.domain.com?
【发布时间】:2011-01-18 03:46:31
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 是什么让你认为 .htaccess 不适用于 Django?
  • 我试过了。但是 mod rewrite 不是我的强项,所以很可能是我弄错了。

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


【解决方案1】:

就配置而言,有人指出的 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 留给读者作为练习。 :-)

【讨论】:

  • 这是一个非常漂亮的小 WSGI sn-p。绝对比我链接的东西更优雅。
  • 虽然我有点作弊。我只假设了“http”,并没有费心重建完整的 URL,并将其留给读者。想要展示这个概念比什么都重要。 Django 中间件更正确。总的来说,应该简单地使用 mod_rewrite。
  • 使用 Apache/Lighttpd/nginx 配置比使用 django 更高效。
  • 谢谢大家!正是我想要的。
  • 为什么我们不应该使用Apache Redirectstackoverflow.com/a/1100363/1161025
【解决方案2】:

PREPEND_WWW 设置就是这样做的。

【讨论】:

  • 这很有用,但值得注意的是它是完全不分青红皂白的......如果没有 www,它总是会添加一个 www,因此对于一个也可以从不应启动的子域访问的站点有了 www,就需要 Graham 的建议。
【解决方案3】:

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

一些例子:

这是更好的 sn-p-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))

【讨论】:

    【解决方案4】:

    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>
    

    这样就可以了。

    【讨论】:

    • 效果很好!为什么没有更多的人使用这种方法?有什么问题吗?
    • 不是每个人都可以访问Apache配置,我认为它只是使用它的限制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多