我有两个域指向同一个服务器,一个我们打电话home ,一个我们打电话给web 。
我在端口80上运行nginx的HTTP和443的HTTPS。 在我的服务器定义中,我定义了两个服务器:
server { listen 80; server_name web; # ... } server { listen 443; server_name web; # ... }
在实践中,它工作得很好。 但是,当我尝试访问指向与web相同的IP地址的home时,我得到服务的web而不是404或类似的东西。
如何将nginxconfiguration为404个与服务器名称不匹配的请求? 我是否需要定义一个默认的服务器,将事件弹回到404s?
Catchall服务器块还需要一个server_name ,您需要将其设置为一个无效的值,如_ 。 这样,服务器块将不会匹配任何其他主机名,只是作为最后的手段使用。 configuration将如下所示:
server { listen 80; listen 443 ssl; server_name _; return 404; }
configuration中的第一台服务器就像一个全能的服务器,这就是为什么它被显示。 在listen 80服务器之前添加这样的内容{}
server { return 404; } server { listen 80; server_name web; # ... } server { listen 443; server_name web; # ... }
对于http:
server { listen 80 default_server; server_name _; return 404; }
对于https,你实际上需要在ssl cert / key处指向nginx。 根据文档 ,nginx只查看“主机”头,并且在匹配server_name时不会查看TLS SNI。 这意味着nginx在检查Host头之前必须能够接受/解密ssl连接。
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连接而失败。