1

我已将此添加到我的.htacces

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

但随后尝试到达www.example.com将我重定向到:

http://example.com/example/wsgi.py/

因为我有WSGIScriptAlias / home/www/example.com/example/wsgi.py指令httpd.conf,当然我得到 404 错误。

最终,我设法通过在我的下面添加下一行来解决urls.py这个问题:

url(r'^example/wsgi.py/$', index),(所以它重定向到主页)

但我不太确定这是正确的方法(因为当我尝试访问时,example.com我看到网络浏览器将地址快速更改为www.example.com然后再次更改为example.com

如果有人会问,是的,我已经看到了,但这也对我没有帮助,因为浏览器出现 url 递归问题(example.com/example.com/example.com/example.com/example.com ...)

编辑:文件夹结构

这是我的文件夹结构:

\mysite\ static\ media\ .htaccess manage.py mysite\ templates templatetags tinymce static urls.py settigs.py views.py wsgi.py models.py forms.py __init__.py

4

4 回答 4

3

我知道这已经回答了一段时间,但要添加到上面给出的答案中使用

host.startswith('www.')

它更具可读性,并且您应该使用永久重定向来为浏览器提供正确的响应标头。

from django import http

class NoWWWRedirectMiddleware(object):
    def process_request(self, request):
        host = request.get_host()
        if host.startswith('www.'):
            if request.method == 'GET':  # if wanna be a prefect REST citizen, consider HEAD and OPTIONS here as well
                no_www_host = host[4:]
                url = request.build_absolute_uri().replace(host, no_www_host, 1)
                return http.HttpResponsePermanentRedirect(url)
于 2015-04-23T01:09:52.397 回答
2

我发现使用中间件完成无 www 重定向比使用 Apache mod_rewrite 配置要简单得多。

您链接到的中间件看起来可以解决问题。我猜您的问题来自 Apache 配置 - 确保删除所有 mod_rewrite 命令(Rewrite*东西),然后重新启动 apache 服务器(参考Apache 文档,但检查您的操作系统,可能是特定的)。

您应该只进行一项额外的调整:确保您不重定向任何 POST 请求,因为这可能会导致数据丢失(切线参考:为什么 HTTP 没有 POST 重定向?)。

无论如何,这就是我使用的,对我来说效果很好:

from django.http import HttpResponseRedirect

class NoWWWRedirectMiddleware(object):
    def process_request(self, request):

    if request.method == 'GET':  # if wanna be a prefect REST citizen, consider HEAD and OPTIONS here as well
        host = request.get_host()
        if host.lower().find('www.') == 0:
            no_www_host = host[4:]
            url = request.build_absolute_uri().replace(host, no_www_host, 1)
            return HttpResponseRedirect(url)

要使用它,请在某处放置一个文件,也许是mysite/mysite/middleware.py. 然后确保它在你的settings.py

MIDDLEWARE_CLASSES = (
    'mysite.middleware.NoWWWRedirectMiddleware',
    # ... other middleware ...

如果没有MIDDLEWARE_CLASSESsettings.py则从此处复制 Django 文档中的默认值,但让您查看的是正确版本的 Django,1.7 中有一些更改!

于 2014-10-18T21:03:49.943 回答
1

与 Django 1.11+ 风格的中间件一起使用的修改版本:

from django.http import HttpResponsePermanentRedirect

class NoWWWRedirectMiddleware:
    def __init__(self, get_response=None):
        self.get_response = get_response

    def __call__(self, request):
        response = self.process_request(request)
        return response or self.get_response(request)

    def process_request(self, request):
        host = request.get_host()
        if host.startswith('www.'):
            if request.method == 'GET':
                no_www = host[4:]
                url = request.build_absolute_uri().replace(host, no_www, 1)
                    return HttpResponsePermanentRedirect(url)
于 2018-11-28T04:46:11.413 回答
0

这个 Apache 配置对我有用:

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

WSGIScriptAlias / /home/www/example.com/example/wsgi.py
WSGIPythonPath /home/www/example.com/example

<Directory /home/www/example.com/example>
  <Files wsgi.py>
    Require all granted
  </Files>
</Directory>
于 2014-10-16T16:21:57.507 回答