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;
}
}
答案 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
标题的新请求。