Skip to main content
 首页 » 编程设计

python之django/nginx 中无法解释的无效 HTTP_HOST 错误

2025年05月04日26cyq1162

我经常在 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:无效的 HTTP_HOST header (您可能需要设置 ALLOWED_HOSTS):someotherdomainname.tld

但是我每天通过标准的 django 错误记录器收到 4 或 5 个这样的错误。 someotherdomain.tld 可以是 *.example.com(我的服务器的通配符)、服务器的 IP 地址或随机的东西,例如 device-metrics-us-2.amazon.com:443 或data.flurry.com 仅举几例。更令人困惑的是,我可以转到服务器 IP 地址或其他任何内容。example.com,我得到了没有错误电子邮件的 nginx 404 屏幕(预期行为)。

我相当确定这是由于以下事实造成的:如果您在公司登录我们的公共(public) wifi,该网站是为您提供的,您必须以访客身份登录,然后它会将您重定向到我们的网站(这很烦人,但 CEO坚持...)。这些错误是无害的,没有人报告说在尝试访问 amazon.com 或类似网站时看到了 django 错误页面。我只是对如何考虑我的 nginx 配置感到困惑。

请您参考如下方法:

假设您已经正确配置了 django (ALLOWED_HOSTS);那么可能有人只是在欺骗标题。主机欺骗是检查漏洞的常用策略。

您可以通过拒绝服务器负责的内容以外的任何内容来完全防止这些:

if ($host !~* ^(example.com|classes.example.com|www.example.com)$) { 
        return 444; 
}