nginx 响应未知主机名?

nginx 响应未知主机名?

我有两个指向同一台服务器的域,一个我们将调用home,另一个我们将调用web

我在端口 80(用于 HTTP)和 443(用于 HTTPS)上运行 nginx。在我的服务器定义中,我定义了两个服务器:

server {
    listen 80;
    server_name web;
    # ...
}

server {
    listen 443;
    server_name web;
    # ...
}

实际上,它工作得很好。但是,当我尝试访问指向home与 相同的 IP 地址的时web,我得到了服务,web而不是得到 404 或类似的错误。

如何配置 nginx 以处理与服务器名称不匹配的 404 请求?我是否需要定义一个默认服务器,将请求反弹至 404?

答案1

对于 http:

server {
    listen 80 default_server;
    server_name _;
    return 404;
}

对于 https,您实际上需要将 nginx 指向 ssl cert/key。根据 文档,nginx 在匹配 server_name 时仅查看“Host”标头而不查看 TLS SNI。这意味着 nginx 必须能够接受/解密 ssl 连接,然后才能检查 Host 标头。

server {
    listen 443 ssl default_server;
    server_name _;
    ssl_certificate <path to cert>
    ssl_certificate_key <path to key>
    return 404;
}

证书/密钥可以是任何证书/密钥,例如自签名的。

如果没有指定 cert/key,nginx 仍会尝试使用这样的 default_server,并且由于无法接受 ssl 连接而失败。

答案2

Catchall 服务器块还需要一个server_name,您需要将其设置为无效值,例如_。这样,服务器块将不会匹配任何其他主机名,并且只会作为最后的手段使用。配置将如下所示:

server {
    listen 80;
    listen 443 ssl;

    server_name _;

    return 404;
}

答案3

配置中的第一个服务器 {} 就像一个万能的,所以才会显示它。在 listen 80 server {} 之前添加类似这样的内容

server {
    return 404;
}

server {
    listen 80;
    server_name web;
    # ...
}

server {
    listen 443;
    server_name web;
    # ...
}

相关内容