nginx正在提供页面以请求裸IP地址(与server_name不匹配)

时间:2019-03-21 09:31:27

标签: nginx nginx-config

我有一个nginx配置,其中有两个虚拟主机,没有默认站点。

server {
  listen 123.45.67.89:80;
  server_name site_a.example.com site_a1.example.com;

  root /srv/site_a_checkout/html/site_a;
  access_log /var/log/site_a/nginx.access.log;
  error_log /var/log/site_a/nginx.error.log;

  index index.html index.htm index.nginx-debian.html;

  location / {
    # First attempt to serve request as file, then
    # as directory, then fall back to displaying a 404.
    try_files $uri $uri/ =404;
  }
}

每个虚拟主机配置都有一个server_name行,其中包含两个服务器。

第二个服务器名site_a1.example.com之所以存在,是因为存在不止一台服务器,有时开发人员需要知道他们正在查看的服务器。

如果请求http://site_a.example.comhttp://site_a1.example1.comhttp://site_b.example.comhttp://site_b1.example1.com,nginx的性能将完全符合预期。

问题在于,如果请求http://123.45.67.89,则site_a网站将得到服务。

没有/etc/nginx/sites_enabled/default,只有site_a和site_b的虚拟主机。

为什么site_a被用作http://123.45.67.89

如何使对IP地址的请求失败?


我也尝试过:https://superuser.com/a/1050864https://serverfault.com/a/525011,但它们都不起作用。

1 个答案:

答案 0 :(得分:0)

这些解决方案都不起作用,因为它们隐式地侦听0.0.0.0:80,而虚拟主机侦听123.45.67.89:80。

对于虚拟主机侦听的任何特定IP地址,都需要存在默认服务器。

这有效:

server {
  server_name _;
  listen 123.45.67.89:80 default_server deferred;
  return 444;
}

如果我添加:

  listen 123.45.67.89:443 default_server deferred;

它杀死HTTPS连接(在读取SNI之前),从而破坏该IP地址上的所有SSL虚拟主机。这又是一个问题。 https://serverfault.com/q/959286/20520