最近,我将django站点从http升级到https。然而,在那之后,我不断地收到Invalid HTTP_HOST header错误电子邮件,而以前我从未收到过这样的电子邮件。
下面是一些日志消息:
Django错误(外部IP):无效的HTTP_HOST报头:'123.56.221.107‘。您可能需要在ALLOWED_HOSTS中添加'123.56.221.107‘。
Django错误(外部IP):无效的HTTP_HOST标题:'www.sgsrec.com‘。您可能需要将“www.sgsrec.com”添加到ALLOWED_HOSTS中。
Django错误(外部IP):无效的HTTP_HOST头:'sgsrec.com‘。您可能需要将“sgsrec.com”添加到ALLOWED_HOSTS中。
在/apple-app站点上报告无效的HTTP_HOST标题:‘sgsrec.com’。您可能需要将“sgsrec.com”添加到ALLOWED_HOSTS中。
无效的HTTP_HOST标题:‘www.pythonzh.cn’。您可能需要将“www.pythonzh.cn”添加到ALLOWED_HOSTS中。
报告在/无效的HTTP_HOST头:‘www.pythonzh.cn’。您可能需要将“www.pythonzh.cn”添加到ALLOWED_HOSTS中。
请求方法: GET请求URL:http://www.pythonzh.cn/ Django版本: 1.10.6
Django错误(外部IP):无效的HTTP_HOST头:'pythonzh.cn‘。您可能需要将“pythonzh.cn”添加到ALLOWED_HOSTS中。
奇怪的是,我只更改我的博客站点www.zmrenwu.com nginx配置,但似乎我所有托管在123.56.221.107上的站点都已生效。
当然,我正确地设置了ALLOWED_HOSTS:
ALLOWED_HOSTS = ['.zmrenwu.com']
ALLOWED_HOSTS = ['.sgsrec.com']
ALLOWED_HOSTS = ['.pythonzh.cn']我的博客网站www.zmrenwu.com的Nginx配置
server {
charset utf-8;
server_name zmrenwu.com www.zmrenwu.com;
listen 80;
return 301 https://www.zmrenwu.com$request_uri;
}
server {
charset utf-8;
server_name zmrenwu.com;
listen 443;
ssl on;
ssl_certificate /etc/ssl/1_www.zmrenwu.com_bundle.crt;
ssl_certificate_key /etc/ssl/2_www.zmrenwu.com.key;
return 301 https://www.zmrenwu.com$request_uri;
}
server {
charset utf-8;
listen 443;
server_name www.zmrenwu.com;
ssl on;
ssl_certificate /etc/ssl/1_www.zmrenwu.com_bundle.crt;
ssl_certificate_key /etc/ssl/2_www.zmrenwu.com.key;
location /static {
alias /home/yangxg/sites/zmrenwu.com/blogproject/static;
}
location /media {
alias /home/yangxg/sites/zmrenwu.com/blogproject/media;
}
location / {
proxy_set_header Host $host;
proxy_pass http://unix:/tmp/zmrenwu.com.socket;为什么会这样?我怎样才能解决这个问题?
发布于 2018-04-13 13:02:51
您需要添加一个块
location / {
}此条件(针对非您的域请求):
if ( $host !~* ^(yourdomain.com|www.yourdomain.com)$ ) {
return 444;
}和
sudo service nginx reload发布于 2017-12-17 02:19:07
在我看来,禁用另一个答案中建议的DisallowedHost主机警告并不是正确的解决方案。Django给出这些警告是有原因的,最好在这些请求到达Django之前阻止它们。
您在nginx配置中创建了一个新的服务器块。因为它是您定义的唯一HTTPS服务器,因此它成为该端口的默认服务器。来自文档
如果存在
default_server参数,则将导致服务器成为指定address:port对的默认服务器。如果没有一个指令具有default_server参数,那么具有address:port对的第一个服务器将是这对的默认服务器。
这就解释了为什么突然看到所有这些无效的主机错误。任何试图通过HTTPS连接到您的服务器的机器人都将使用此默认服务器。由于许多机器人将使用假主机名或仅使用服务器IP (这两种都不在ALLOWED_HOSTS中),这将导致Django中的警告。
那么解决方案是什么呢?您可以创建一个单独的服务器块来处理所有此类无效请求:
server {
listen 443 ssl default_server;
server_name _;
return 444;
}444是nginx对断开无效请求使用的一种特殊响应状态。
添加此块后,它将用于所有不匹配要响应的主机标头的请求,任何试图与无效主机连接的请求都将无法连接。
Django将停止查看无效主机的请求。
发布于 2017-12-16 16:16:04
这可能是因为可能有正在运行的bot脚本,这些脚本针对的是具有不同HTTP_HOST头的服务器(这是常见的)。在django中,允许将主机设置为特定的主机。因此,如果与允许主机中指定的主机头不同,则django将给出400错误。默认情况下,django记录器被配置为在每个错误上发送邮件。要停止获取邮件,您需要在django中配置记录器,并添加以下记录器'django.security.DisallowedHost': { 'handlers': ['null'], 'propagate': False, },
https://stackoverflow.com/questions/47846521
复制相似问题