Django允许的主机错误:域名与IP地址

2 投票
1 回答
4543 浏览
提问于 2025-04-18 11:55

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 address >'。你可能需要把 u'< ip address >' 加入 ALLOWED_HOSTS。

但是邮件的内容只是:

没有可用的堆栈跟踪。

请求的 repr() 不可用。

我知道重定向是有效的,因为如果我尝试访问 www.domain.com,我会被重定向到 domain.com。

我想更好地检查请求对象,以了解请求是如何到达 django 的。 只有访问 domain.com 的请求应该被转发到 django。
有没有人知道我该怎么做?

或者如果有人知道这里发生了什么,那就更好了。

根据要求,这里是 nginx 的配置:

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 个回答

1

Django中的ALLOWED_HOSTS设置会检查你在HTTP请求中的Host头,这个头是浏览器在发送请求时生成的。

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

如果真是这样的话,那么重定向实际上是在服务器内部进行的。浏览器发送的请求中的原始Host头仍然会保持它的原始值。

对于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头。

撰写回答