Skip to main content
 首页 » 编程设计

python之www 域和 ip 地址的 django allowed_hosts 错误

2025年05月04日43虾米哥

Django 1.6

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

我已经设置了 django 以通过电子邮件向我发送任何错误

我收到一堆错误,如下所示:

[Django] ERROR: Invalid HTTP_HOST header: 'www.domain.com'.You may need to add u'www.domain.com' to ALLOWED_HOSTS

或

[Django] ERROR: Invalid HTTP_HOST header: '< ip address >'.You may need to add u'< ip address >' to ALLOWED_HOSTS

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

No stack trace available

Request repr() unavailable.

我知道重定向有效,因为如果我尝试访问 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; 
    } 
 
} 

请您参考如下方法:

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

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

如果是这种情况,那么重定向基本上是服务器内部的。浏览器发送的请求中的原始 Hosts header 仍将具有其原始值。

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 header 的新请求。