【问题标题】:Why is nginx accepting requests with a Host header that doesn't match server_name?为什么 nginx 接受 Host 标头与 server_name 不匹配的请求?
【发布时间】:2017-01-27 03:00:43
【问题描述】:

我有一个这样设置的站点:nginx 作为代理服务器,代理请求 tu 一个 gunicorn 实例通过 UNIX 套接字为 Django 站点提供服务。

这是我的 nginx 配置:

server {
    listen 80;
    server_name api.mysite.com;

    location /static/ {
        alias /webapps/mysite/static/;
        autoindex off;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/webapps/mysite/mysite.sock;
    }

}

我的理解是,nginx 在收到请求时,会将 Host 标头与服务器块的 server_name 参数进行匹配,如果匹配,则提供服务。但是,nginx 似乎正在尝试使用与 api.mysite.com 不同的 Host 标头来服务(将请求传递给我的 Django 服务器)请求。 Django 有一个名为ALLOWED_HOSTS 的设置(在我的情况下设置为['api.mysite.com']),它执行进一步检查Host 标头并在请求Host 标头不匹配时引发错误,这不应该发生,因为据说 nginx 已经过滤了这个。问题是我看到 Django 引发的错误如下所示:

  • HTTP_HOST 标头无效:'/webapps/mysite/mysite.sock:'。根据 RFC 1034/1035,提供的域名无效。
  • HTTP_HOST 标头无效:'testp1.piwo.pila.pl'。您可能需要将“testp1.piwo.pila.pl”添加到 ALLOWED_HOSTS。
  • 无效的 HTTP_HOST 标头:'xxx.xxx.xxx.xxx' (我的服务器的真实 IP)。您可能需要将“xxx.xxx.xxx.xxx”添加到 ALLOWED_HOSTS。

有几点:

  • 我知道请求是通过 nginx 发出的,因为它们显示在 nginx 日志中,而且无论如何直接访问 gunicorn 服务器都是不可能的,因为我通过 UNIX 套接字而不是通过 HTTP 进行代理。
  • 我知道这些请求来自一个寻找免费代理的机器人,但我对此并不在意。我真正感兴趣的是带有 Host 标头的请求设置为我的 gunicorn/nignx UNIX 套接字的本地文件系统上的路径。

有什么线索吗?

【问题讨论】:

  • 你有 nginx 的默认站点吗?过去我遇到过一个问题,当主机与任何 server_names 不匹配时,它会提供按字母顺序找到的第一个。
  • @cdvv7788 我没有默认服务器,所以我想可能就是这样。我下午去看看。
  • @AlexeyTen 我已经阅读了该文档,但由于某种原因错过了默认服务器的部分。
  • 不过,我对带有“/webapps/mysite/mysite.sock:”主机标头的请求感到好奇。

标签: django unix nginx proxy gunicorn


【解决方案1】:

事实证明,如果 nginx 没有遇到匹配的服务器块,它会将请求发送到第一个服务器块。所以解决方案是设置一个默认的服务器块,像这样丢弃每个请求:

server {
    listen 80 default_server;
    return 444;
}

【讨论】:

  • 我厌倦了添加上面的配置,作为 /etc/nginx/sites-available 中的默认 444 配置,并带有来自启用站点的符号链接。我可以看到配置是实时的(因为 nginx 从监听 123.45.67.89:80 变为 0.0.0.0:80)但是在请求 http://123.45.67.89 时我仍然得到一个页面。 stackoverflow.com/questions/55277279/…
猜你喜欢
  • 2018-09-19
  • 2020-09-09
  • 1970-01-01
  • 1970-01-01
  • 2017-05-05
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
相关资源
最近更新 更多