nginx 响应未知主机名?

Naf*_*Kay 9 http nginx https

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

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

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

server {
    listen 443;
    server_name web;
    # ...
}
Run Code Online (Sandbox Code Playgroud)

在实践中,它工作得很好。但是,当我尝试访问home指向与 相同的 IP 地址的 时web,我会得到服务,web而不是得到 404 或类似信息。

如何将 nginx 配置为与服务器名称不匹配的 404 请求?我是否需要定义一个默认服务器,它只会将事情退回到 404 秒?

小智 15

对于 http:

server {
    listen 80 default_server;
    server_name _;
    return 404;
}
Run Code Online (Sandbox Code Playgroud)

对于 https,您实际上需要将 nginx 指向 ssl 证书/密钥。根据 文档,nginx 在匹配 server_name 时只查看“主机”标头,而不查看 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;
}
Run Code Online (Sandbox Code Playgroud)

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

如果没有指定 cert/key,nginx 仍然会尝试使用这样的 default_server 并且失败,因为它不能接受 ssl 连接。


小智 6

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

server {
    listen 80;
    listen 443 ssl;

    server_name _;

    return 404;
}
Run Code Online (Sandbox Code Playgroud)


Mik*_*ike 4

配置中的第一个服务器 {} 就像一个包罗万象的东西,所以这就是显示它的原因。在listen 80 server {}之前添加类似的内容

server {
    return 404;
}

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

server {
    listen 443;
    server_name web;
    # ...
}
Run Code Online (Sandbox Code Playgroud)

  • 很好,但 HTTPS 请求似乎仍然被转发到错误的位置。我已将 SNI 编译到 nginx 中,有没有办法对不匹配的 HTTPS 请求执行相同的操作? (2认同)
  • 如果我添加一个`server {listen 443 default_server; 返回404;}`,我的其他 SSL 虚拟主机已损坏。 (2认同)