遵守 Nginx 中的 server_name

遵守 Nginx 中的 server_name

我希望 nginx/0.7.6(在 debian 上,即配置文件在 中/etc/nginx/sites-enabled/)只在一个子域(由 Host 标头指示)上为网站提供服务,而不在所有其他子域上提供服务。但它坚决忽略我的server_name设置?!

sites-enabled/sub.domain

server {
  listen 80;
  server_name sub.domain;
  location / { … }
}

添加sites-enabled/00-default

server {
  listen 80;
  return 444;
}

什么也不做(我猜它只是匹配没有主机的请求?)

server {
  listen 80;
  server_name *.domain;
  return 444;
}

确实阻止Host: domain请求给出结果Host: sub.domain,但仍Host: arbitrary视为Host: sub-domain

在我看来,显而易见的解决方案不被接受:

server {
  listen 80;
  server_name *;
  return 444;
}

既不是

server {
  listen 80 default_server;
  return 444;
}

因为顺序似乎很重要:重命名00-defaultzz-default,如果已排序,则将其放在最后,不会改变任何内容。但是 debian 的主配置只包含*,所以我猜它们可以按照某种任意文件系统定义的顺序包含?


Host:当不符合预期时,不会返回任何内容sub.domain,但当完全缺失时仍会返回内容Host。我以为第一个块应该处理这种情况!?是因为它是第一个块吗?

server {
  listen 80;
  return 444;
}
server {
  listen 80;
  server_name ~^.*$;
  return 444;
}

答案1

在 nginx 中定义默认服务器的方式是通过在服务器上设置default_server标志(在 0.7 中,它只是)default语句。 server_name _;并不意味着什么特殊的东西。nginx 也不会对全局文件名进行排序,因此不能保证文件以任何特定顺序包含在内。

server {
  listen 80 default;
  return 444;
}

答案2

将此用作第一个块将匹配所有未与任何后续server_name: sub.domain块匹配的请求。不知道为什么_不起作用,使用正则表达式似乎有点不靠谱。

server {
  listen 80;
  server_name ~^.*$ "";
  return 444;
}

~^.*$匹配所有Host:标头,""不匹配任何Host:正在发送的标头。

答案3

默认虚拟主机应该包含:

server_name _;

这是一个包罗万象的这将匹配任何其他server_name指令中未指定的任何主机名。

当您注意到当server_name缺少时,块仅匹配没有Host:标题的请求时,您也是正确的。

请注意,这可能不适用于 nginx 0.7.x,因为它已经过时了,而且很多东西都发生了变化。如果你坚持使用 Debian,请帮自己一个忙,使用点德布存储库与 nginx、MySQL 和 PHP 等软件保持同步,对于这些软件来说,比 Debian 更新得更快至关重要。

相关内容