我经常在django中看到非常奇怪的INVALID_HOST错误。网站域名(从现在开始称为example.com)是nginx传递给django的唯一内容。 example.com位于django.conf.settings.ALLOWED_HOSTS
。其他一切都直接进入nginx的404.这是我配置中的相关行:
server { return 404; }
upstream django {
server 127.0.0.1:3033;
}
server {
listen 80;
server_name classes.example.com;
return 302 https://example.com/classes/;
}
server {
listen 80;
server_name *.example.com example.com;
return 302 https://example.com$request_uri;
}
server {
if ($host ~* "^classes.example.com$") {
rewrite ^.*(?=\/)(.+)$ https://example.com/classes/ permanent;
break;
}
listen 443;
root /home/django/example.com;
server_name *.example.com example.com;
# here are static files/ irrelevant code
location / {
uwsgi_pass django;
include uwsgi_params;
}
}
对我而言,我说永远不会看到以下邮件通过电子邮件发送给我。
SuspiciousOperation: Invalid HTTP_HOST header (you may need to set ALLOWED_HOSTS): someotherdomainname.tld
但是我通过标准的django错误记录器每天收到4或5个。 someotherdomain.tld
可以是* .example.com(我的服务器的通配符),服务器的IP地址,或随机的东西,如device-metrics-us-2.amazon.com:443或data.flurry.com仅举几例。为了使问题更加混乱,我可以转到服务器IP地址或whatever.example.com,我得到nginx 404屏幕,没有错误电子邮件(预期的行为)。
我相当肯定这是因为如果你登录公司的公共wifi,那么你必须以访客的身份登录,然后将你重定向到我们的网站(烦人但是CEO)坚持...)。这些错误是无害的,当他们试图访问amazon.com或类似的东西时,没有人报告过看到django错误页面。考虑到我的nginx配置,我只是觉得它是如何可能的。
答案 0 :(得分:1)
假设您已正确配置django(ALLOWED_HOSTS
);然后它可能是某人只是欺骗标题。主机欺骗是检查漏洞的常用策略。
您可以通过拒绝服务器负责的任何内容来完全阻止这些:
if ($host !~* ^(example.com|classes.example.com|www.example.com)$) {
return 444;
}