在 Nginx 中重定向不存在的主机上的 https 请求

在 Nginx 中重定向不存在的主机上的 https 请求

我有一个 Nginx Web 服务器(容器化,但这在这里并不重要),它为几个不同域上的 http 和 https 站点提供服务。

对于其中一个域,有几个子域,我想将所有 http 和 https 请求重定向到一个域。以下是相关的 Nginx 配置位:

server {
    listen      80;
    listen      443 ssl;
    server_name *.example.com;
    return 301  https://example.com$request_uri;
}

但是当我提出请求时https://www.example.com/about.html,我收到安全警告,提示网站证书无效。检查证书后发现,Nginx 已使用来自另一个域的 SSL 证书为网站提供服务,这显然是第一个匹配 SSL 证书的 Nginx 配置。我可以“接受风险并继续”,然后重定向就会通过。

什么样的配置才能更合适地处理,不会让用户面临安全警告和不相关的 SSL 证书?

答案1

首先,您需要一个通配符 SSL 证书。如果没有通配符证书,您将需要为每个正在服务的子域获取证书。我认为缺少通配符证书是您最大的问题。

我要改变的第二件事是您的服务器块的内容。

server {
    listen      80;
 //   listen      443 ssl; # Should not be here
    server_name *.example.com;
    return 301  https://example.com$request_uri;
}

现在仅为 HTTPS 添加一个额外的服务器块。

server {
    listen 443 ssl;
    server_name *.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;     
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

# Include other configuration such as document root etc as required

}

我相信您使用的方法有效地将 http 和 https 重定向到 https。如果我错了,有人会纠正我。

在我看来,通过为 HTTP 和 HTTPS 设置单独的块,.conf 文件更加易读且更清晰。

相关内容