Nginx 提供错误的证书。两个域名重定向

Nginx 提供错误的证书。两个域名重定向

我有两个域名example.comexample.org。两个域名都指向具有静态 IP 的同一台服务器。

第一个配置文件(用于example.com):

# /etc/nginx/sites-enabled/example.com.conf

# Catchall for all non-existent domains
server {
   return 404;
}

# Should redirect http://example.com to https://example.com
server {
   listen 80;
   server_name example.com;
   return 301 https://$server_name$request_uri;
}

# Should redirect http://www.example.com to https://www.example.com
server {
  listen 80;
  server_name www.example.com;
  return 301 https://$server_name$request_uri;
}

server {
  listen 443 ssl;
  server_name example.com;

  # Using LetsEncrypt certs
  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

  root /var/www/example.com/;
  index index.html;

}

这是另一个配置文件

# /etc/nginx/sites-enabled/example.org.conf

# Should redirect http://example.org to https://example.org
server {
   listen 80;
   server_name example.org;
   return 301 https://$server_name$request_uri;
}

# Should redirect http://www.example.org to https://www.example.org
server {
  listen 80;
  server_name www.example.org;
  return 301 https://$server_name$request_uri;
}

server {
  listen 443 ssl;
  server_name example.org;

  ssl_certificate /etc/letsencrypt/live/example.org/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.org/privkey.pem;

  root /var/www/example.org/;
  index index.html;

}

问题就在这里

http://example.com -> https://example.com ✔
https://example.com ✔
http://www.example.com -> https://www.example.com ✔
https://www.example.com ✔

http://example.org -> https://example.org ✔
https://example.org ✔
http://www.example.org -> https://www.example.org ✗
https://www.example.org ✗

在最后两种情况下( ),将提供www.example.org的证书。example.com

已启用 SNI 支持:$ nginx -V => TLS SNI support enabled

我的配置有什么问题?

答案1

使用前缀时,您没有server_name用于域的安全版本的 s www.,因此在每种情况下都使用默认服务器。

如果没有明确的默认服务器,则使用与适当端口匹配的第一个服务器块。

您需要将www.变体添加到server_name安全server块中的指令,或使用通配符语法。

这个文件了解详情。

例如:

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

server {
    listen 443 ssl;
    server_name example.com www.example.com;
    ...
}

答案2

在我的例子中,我编辑了本地/etc/hosts文件,将我正在测试的域名指向另一个服务器 IP 地址,该服务器目录中没有启用该网站/etc/nginx/sites-enabled。Nginx 提供的是另一个网站,因此证书也不同。

相关内容