www域和ip地址的django allowed_hosts错误

时间:2014-07-02 18:58:43

标签: python django

django 1.6

我有我的网络服务器将www请求重定向到非www等价物。即www.domain.com转到domain.com

我有django设置给我发电子邮件任何错误

我得到了一堆看起来像的错误:

  

[Django]错误:无效的HTTP_HOST标题:'www.domain.com'。您可以   需要将u'www.domain.com'添加到ALLOWED_HOSTS

  

[Django]错误:   HTTP_HOST标头无效:'< IP地址>'。您可能需要添加u'< IP   地址>'到ALLOWED_HOSTS

但电子邮件的内容很简单:

  

没有可用的堆栈跟踪

     

请求repr()不可用。

我知道重定向正在运行,因为如果我尝试访问www.domain.com,我会被重定向到domain.com

我想更好地检查请求对象,以了解请求如何转到django。应该转发到django的唯一请求应该是转到domain.com的请求。
有谁知道我怎么会这样做?

如果有人知道这里会发生什么事情会很棒,那就更好了。

这里要求的是nginx conf:

server {
    listen <ip address>:80;
    server_name "";
    return 444;
}


server{
    listen <ip address>:80;

    server_name www.domain.com;
    return 301 $scheme://domain.com$request_uri;
}

#HTTPS server
server{
    listen <ip address>:80;
    listen <ip address>:443 ssl;
    server_name domain.com;

    location / {
        uwsgi_pass  unix:<path to socket file>;
        include /etc/nginx/uwsgi_params;    
    }

    if ($ssl_protocol = ""){
        return 301 https://$host$request_uri;
    }

}

1 个答案:

答案 0 :(得分:1)

django中的ALLOWED_HOSTS设置检查HTTP请求中的Host标头,该标头是由浏览器在发送请求时生成的。

在您的Nginx配置中,您(可能)使用URL重写而不是HTTP重定向。

如果 ,则重定向基本上是服务器的内部。

,您的浏览器发送的请求中的原始Hosts标题仍会保留其原始值。

Nginx的正确配置如下:

server {
    listen       80;
    server_name  www.domain.com;
    return       301 http://domain.com$request_uri;
}

server {
    listen       80;
    server_name  domain.com;
    ...django server config...
}

这将导致HTTP 301重定向返回到您的浏览器,浏览器将发送带有正确Host标题的新请求。