当请求的站点未在端口 80 上监听时,nginx 会转到错误的站点

当请求的站点未在端口 80 上监听时,nginx 会转到错误的站点

我在一台服务器上同时拥有生产环境(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;
}

https://github.com/Fleshgrinder/nginx-configuration

如您所见,我返回了 403 Access Forbidden 状态代码,因为这是最适合我的用例的代码(请参阅下面的注释)。如果您只是希望完全不返回任何内容,请使用特殊的 nginx 代码 444。

相关内容