我想使用2个服务器块。 第一个是:
ps -f
第二个是:
server {
listen 443 ssl http2 fastopen=3 reuseport;
server_name a.example.xyz;
include server_safe.conf;
root /home/www/blog/;
}
我想要的:
我希望server_name有效,也就是说,如果我使用 server {
listen 443 ssl http2;
server_name b.example.xyz;
include server_safe.conf;
}
访问我的网站,c.example.xyz
,a.example.xyz
,b.example.xyz
都是相同的IP,服务器应阻止c.example.xyz
请求,因为它不在c.example.xyz
。
但是,如果我输入server_name
,Nginx仍会收到请求并以https://c.example.xyz
我知道HTTP / 2的标头中没有主机,而是a.example.xyz
。
我的问题是:我如何拒绝任何其他要求?我只想接受:authority
= host(:authority)
答案 0 :(得分:2)
问题是,如果没有其他名称匹配,则默认使用第一个服务器块。
因此,为了达到你想要的效果,你需要创建一个默认块,之前另外两个,并让它阻止或重定向,或者显示错误页面。
这样做的缺点是:
除非您拥有所有域名的HTTPS证书(或使用涵盖此域名的通配符证书),否则在访问您网站的https版本并使用此默认配置时,他们会收到错误消息。虽然这会在你目前的设置下发生。在HTTPS协商发生之前,AFAIK无法发送阻止消息。
不支持SNI(主要是Windows XP)的旧客户端将转到默认配置,而之前它们将通过服务器A获得,因为它是默认设置(但不是服务器B)。
另一种方法是根据提供的主机名编写重定向规则。不是100%确定如何在nginx上执行此操作,说实话,但如果默认情况下不可能,则可以使用ModSecurity。再次它只会在生效后才会生效,因此仍然会出现潜在的错误证书问题。