Nginx 重定向到错误的站点;格式不正确的 server_name 指令

Nginx redirecting to the wrong site; poorly formed server_name directive

问题

当您在浏览器的地址栏中键入 example.com 没有 输入方案,即 http://https://,Nginx 重定向用户 https://api.example.com 而不是预期的 https://example.com 。我很确定我的 Nginx 配置有问题,但我不确定是什么。

详情

我在同一台服务器上托管两个网站,使用相同的 IP。 DNS 区域文件中的相关位类似于(此处匿名的域和 IP):

example.com. 1800 IN A xxx.xxx.xxx.xxx
www.example.com. 1800 IN CNAME example.com.
api.example.com. 1800 IN CNAME example.com.

我安装了两个 SSL 证书(由 letsencrypt 提供),每个站点一个,两个站点都配置为重定向到 HTTPS。我有两个 vhost 配置文件,每个站点一个,如下所示:

两者都链接到 /etc/nginx/sites-enabled/。两个配置文件的相关位如下:

# /etc/nginx/sites-available/api
server {
    listen 80;
    listen [::]:80 ipv6only=on;
    server_name api.example.com;
    return 301 https://api.example.com$request_uri;
}
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    include snippets/api-ssl-params.conf; # ssl config info
    server_name api.example.com;

    # ... the rest of the site config ...
}

和:

# /etc/nginx/sites-available/default
server {
    listen 80;
    listen [::]:80;
    server_name www.example.com;
    return 301 https://example.com$request_uri;
}
server {
    listen 443 ssl http2 default_server;
    listen [::]:443 default_server ipv6only=on;
    include snippets/ssl-params.conf; # ssl config info
    server_name example.com;

    # ... the rest of the site config ...
}

我不明白为什么在地址栏中输入 example.com 会重定向到 https://api.example.com,因为:

  1. 只是 example.com 没有出现在 api 配置文件中的任何地方
  2. example.com 不应该匹配 server_name 指令 api.example.com
  3. default 中的服务器块被标记为 default_server 所以当输入不明确的域名时,它不应该优先吗?

谢谢!!!

呃。在写问题的过程中想通了。问题是 example.com 没有出现在任何一个侦听端口 80 的站点的 server_name 指令中。 因为这会导致歧义,nginx 选择字母顺序中的第一个站点订单.

我更新了 default 网站的配置文件如下:

# /etc/nginx/sites-available/default
server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com; # <-- CHANGED THIS LINE
    return 301 https://example.com$request_uri;
}
server {
    listen 443 ssl http2 default_server;
    listen [::]:443 default_server ipv6only=on;
    include snippets/ssl-params.conf; # ssl config info
    server_name example.com;

    # ... the rest of the site config ...
}

宇宙一切正常。