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

Posted

技术标签:

【中文标题】如何在 Django 下将 domain.com 重定向到 WWW.domain.com?【英文标题】:How do I redirect domain.com to WWW.domain.com under Django? 【发布时间】: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 不是我的强项,所以很可能是我弄错了。 【参考方案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 Redirect? ***.com/a/1100363/1161025【参考方案2】:

PREPEND_WWW 设置就是这样做的。

【讨论】:

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

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

一些例子:

http://eikke.com/django-domain-redirect-middleware/ https://djangosnippets.org/snippets/510/ https://djangosnippets.org/snippets/434/

这是更好的 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配置,我认为它只是使用它的限制。

以上是关于如何在 Django 下将 domain.com 重定向到 WWW.domain.com?的主要内容,如果未能解决你的问题,请参考以下文章

Django:如何在没有''的情况下将数组传输到javascript?

如何在同一个域上部署 WordPress 站点和 Django 站点?

Django 错误(外部 IP):无效的 HTTP_HOST 标头:'*.domain.com'

如何在给定 blob url 的情况下将大型音频文件上传到 django 服务器?

如何通过 HTTPS 提供 Django 静态文件?

Django REST 框架。如何获取包含协议、域和路径的页面的完整 url?