我有两个指向同一台服务器的域,一个我们将调用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;
# ...
}