我希望 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-default
为zz-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:
正在发送的标头。