我有一个 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 文件更加易读且更清晰。