nginx 在不同的端口上使用重定向设置多个默认块

nginx 在不同的端口上使用重定向设置多个默认块

我目前有两个 nginx 服务器块来处理对 下任何子域的请求example.com。 在 下添加的子域example.com必须是仅使用 HTTPS 的服务器。 因此服务器块如下:

server {
    server_name ~^(.*)\.example\.com$;
    root /var/www/x;
    listen 443 ssl;
    ...
}

server {
    listen 80;
    server_name ~^(.*)\.example\.com$;
    return 301 https://$host$request_uri;
}

客观的

现在,我还想添加一个默认服务器块任何其他服务器名称,但其所有流量只能在 HTTP 上提供服务,而不是 HTTPS。

因此第一次试验是:

server {
    listen 80 default_server;
    server_name _;
    root /var/www/app;
    ...
}

这很好用,但如果处理的请求是这样的:https://abc.def.com那么用户将收到“您的连接不是私密的”可怕错误,而事实上,如果他们被重定向到 HTTP,我会很高兴。

如果我添加:

server {
    listen 443 default_server;
    server_name _;
    return 301 http://$host$request_uri;
}

然后它可以工作,但是第二个服务器块停止工作,我发现服务器无法处理请求。

我怎样才能做到这一点?

答案1

您要么监听端口443,要么不监听。如果您监听端口,您将获得指向该 IP 的每个主机名的答案,因为主机名的信息仅在已建立的连接内传输。如果您https://在非 HTTPS 站点上手动输入,并且同一 IP 同时监听80HTTP 和443HTTPS 端口,您将收到所有没有正确 TLS 证书的主机名的警告。

您有两个选择:

  1. 让每个网站都支持 HTTPS。在当今这个时代,这应该不成问题让我们加密Certbot服务器名称指示(SNI)这是目前唯一合理的解决方案。

  2. 对于没有 HTTPS 的网站,请设置一个单独的 IP 地址(例如198.51.100.2),并将其指向该 IP 地址。例如,收听 HTTPS 198.51.100.1,它198.51.100.2:443根本没有响应:

    server {
        listen *:80 default_server;
        ...
    }
    
    server {
        listen 198.51.100.1:443 default_server ssl;
        ...
    }
    

相关内容