Django允许的主机错误:域名与IP地址
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
头。