如何在HTTP / 2下的Nginx中使用server_name?

时间:2017-01-02 14:08:01

标签: nginx http2

我想使用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.xyza.example.xyzb.example.xyz都是相同的IP,服务器应阻止c.example.xyz请求,因为它不在c.example.xyz

但是,如果我输入server_name,Nginx仍会收到请求并以https://c.example.xyz

作为回应

我知道HTTP / 2的标头中没有主机,而是a.example.xyz

我的问题是:我如何拒绝任何其他要求?我只想接受:authority = host(:authority)

下的请求

1 个答案:

答案 0 :(得分:2)

问题是,如果没有其他名称匹配,则默认使用第一个服务器块。

因此,为了达到你想要的效果,你需要创建一个默认块,之前另外两个,并让它阻止或重定向,或者显示错误页面。

这样做的缺点是:

  1. 除非您拥有所有域名的HTTPS证书(或使用涵盖此域名的通配符证书),否则在访问您网站的https版本并使用此默认配置时,他们会收到错误消息。虽然这会在你目前的设置下发生。在HTTPS协商发生之前,AFAIK无法发送阻止消息

  2. 不支持SNI(主要是Windows XP)的旧客户端将转到默认配置,而之前它们将通过服务器A获得,因为它是默认设置(但不是服务器B)。

  3. 另一种方法是根据提供的主机名编写重定向规则。不是100%确定如何在nginx上执行此操作,说实话,但如果默认情况下不可能,则可以使用ModSecurity。再次它只会在生效后才会生效,因此仍然会出现潜在的错误证书问题。