防止默认服务器的最佳方法?

Dan*_*anH 29 nginx virtualhost

我有许多虚拟主机,我想通过空白页、错误页面或通常最有效地使用 Nginx 资源的任何方式“关闭”默认虚拟主机,同时只允许其他虚拟主机通过预定义的域。

小智 49

定义一个返回HTTP 444代码的default_server

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

(返回 4xx 错误代码意味着客户端可以将请求解释为不成功的请求,而不是HTTP 200 Blank Page But Totally Work 相信我。)

  • 这不适用于 https。一个简单的侦听 443 default_server 也不起作用,因为首先发生 ssl 握手并且 nginx 在返回 444 之前会出错。我尚未尝试但应该工作的一个解决方案是为默认 https 服务器创建一个自签名证书并选择创建重定向到 http 以避免任何浏览器错误。 (4认同)
  • 444是一个[非标准nginx](http://nginx.org/en/docs/http/request_processing.html)的具体代码:_"返回一个特殊的nginx的非标准代码444,关闭连接"_ (3认同)
  • 我不会编辑此内容,因为它仅在最近的“1.19.4”版本中工作,但 [`ssl_reject_handshake`](https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_reject_handshake) 现在是可用于更好地处理 https 情况。 (3认同)
  • 提供拒绝 SSL 连接的好方法的 nginx 票证是 [here](https://trac.nginx.org/nginx/ticket/195)。他们还提供了 [workaround](https://trac.nginx.org/nginx/ticket/195#comment:6),设置 `ssl_ciphers aNULL;`。 (2认同)
  • 请注意,我提到的解决方法将破坏不支持 SNI 的 HTTPS 客户端(例如 nginx 自己的 `proxy_pass`,除非您设置了 `proxy_ssl_server_name on;`),无法访问任何其他 `server_names`(因此基本上会破坏端口的合法 `server_name`s 443 你_确实_想让通过)。有关详细信息,请参阅 https://trac.nginx.org/nginx/ticket/195#comment:11。 (2认同)