【问题标题】:How to use server_name in Nginx under HTTP/2?如何在 HTTP/2 下的 Nginx 中使用 server_name?
【发布时间】:2017-01-04 01:33:57
【问题描述】:

我想使用 2 个服务器块。 第一个是:

    server {
    listen 443 ssl http2 fastopen=3 reuseport;
    server_name a.example.xyz;
    include server_safe.conf;
    root /home/www/blog/;
    }

第二个是:

  server {
    listen 443 ssl http2;
    server_name b.example.xyz;
    include server_safe.conf;
}

我想要的: 我希望 server_name 有效,也就是说,如果我使用 c.example.xyz 访问我的网站,a.example.xyz,b.example.xyz,c.example.xyz 是相同的 IP,服务器应该阻止 c.example.xyz 请求,因为它不在server_name 中。

但是,如果我输入https://c.example.xyz,Nginx 仍然会收到请求并回复为a.example.xyz

我知道 HTTP/2 的标头中没有主机,而是有一个 :authority

我的问题是:我如何拒绝任何其他请求?我只想接受host(:authority) = a(b).example.xyz下的请求

【问题讨论】:

    标签: nginx http2


    【解决方案1】:

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

    因此,要实现您想要的,您需要创建一个默认块,其他两个之前,并让它阻止或重定向,或显示错误页面。

    这样做的缺点是:

    1. 除非您拥有所有域名的 HTTPS 证书(或使用涵盖此内容的通配符证书),否则在转到您的站点的 https 版本并使用此默认配置时会出错。尽管无论如何这都会在您当前的设置下发生。 AFAIK 无法 HTTPS 协商发生之前发送阻止消息。

    2. 不支持 SNI 的旧客户端(主要是 Windows XP)将进入默认配置,而以前它们会通过服务器 A,因为它是默认配置(尽管不是服务器 B)。

    另一种方法是根据提供的主机名编写重定向规则。老实说,不是 100% 确定如何在 nginx 上执行此操作,但如果默认情况下不可能,那么使用 ModSecurity 是可能的。同样,它只会在 HTTPS 协商发生后才会生效,因此仍然会给您留下潜在的错误证书问题。

    【讨论】:

    • 你是对的,根据你的回答,我在其他服务器块之前用server_name _创建了一个新的服务器块,这样任何其他请求都可以得到404。当然,因为它得到了一个404的响应,它已经通过了https协商。我的证书有 SAN,我的 nginx 有 SNI,所以证书不是问题。最后,非常感谢
    猜你喜欢
    • 2015-01-17
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 2016-05-04
    相关资源
    最近更新 更多