我在一台服务器上同时拥有生产环境(www.myexample.com)和开发环境(dev.myexample.com),使用服务器块和单独的目录,并且都监听端口 80。这工作正常。
现在我已经安装了 SSL 证书并在站点配置文件中启用了 SSL 模式。同时,我将监听端口从 80 更改为 443,因此站点不应在端口 80 上响应,而应仅在端口 443 上响应。开发站点仍按原样运行。
现在看来,当我连接到http://www.myexample.com。
为了解决这个问题,我添加了一个真正的“默认”服务器块(server_name 设置为 _)并指向一个不包含文件的目录。
有没有更好的方法?如果我想要一个真正的默认网站,我不希望它显示为已知主机名。我猜我必须创建一个监听 www.myexaple.com:80 的服务器块,并将其配置为以某种方式拒绝所有页面请求,但该怎么做呢?
我怎样才能完全停止响应任何针对我不托管的网站的请求?
答案1
使用无效主机名配置默认服务器始终是一个好主意,这可以确保未设置任何主机头字段(或未配置主机)的客户端被拒绝。
server {
listen [::]:80 backlog=65536 default_server deferred ipv6only=off rcvbuf=16k sndbuf=512k;
server_name _;
return 403;
}
server {
listen [::]:443 backlog=65536 default_server deferred ipv6only=off rcvbuf=16k sndbuf=512k spdy ssl;
server_name _;
ssl_certificate certificates/_/pem;
ssl_certificate_key certificates/_/key;
return 403;
}
如您所见,我返回了 403 Access Forbidden 状态代码,因为这是最适合我的用例的代码(请参阅下面的注释)。如果您只是希望完全不返回任何内容,请使用特殊的 nginx 代码 444。