当ssl和http2打开时,Nginx似乎忽略了服务器名称

当ssl和http2打开时,Nginx似乎忽略了服务器名称,ssl,nginx,Ssl,Nginx,我有这个nginx配置: server { listen 80 default_server; listen [::]:80 default_server; server_name www.example.com; return 301 https://www.example.com$request_uri; } server { listen 443 ssl http2; server_name www.example.com; inc

我有这个nginx配置:

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

server {
    listen 443 ssl http2;
    server_name www.example.com;
    include snippets/ssl-params.conf;
    client_max_body_size 5G;
                location / {
                        proxy_pass http://127.0.0.1:8888;
                }
}

所以
http://www.example.com
被重定向到
https://www.example.com
。问题是,
https://example.com
还可以工作并提供到端口的代理传递
8888
。我怎样才能阻止它工作?我只需要与www版本工作。参数服务器名称似乎没有任何效果。我使用的是“nginx version:nginx/1.10.1”。

除非您为端口443明确定义默认服务器,
nginx
将使用第一个匹配的
server
块来处理请求。有关详细信息,请参阅

解决方案是显式定义具有所需行为的默认服务器,例如:

server {
    listen 443 ssl http2 default_server;
    return 301 https://www.example.com$request_uri;
    include snippets/ssl-params.conf;
}    
事实上,如果删除
server\u name
指令,您可能会将其滚到端口80
server
块中:

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    listen 443 ssl http2 default_server;
    return 301 https://www.example.com$request_uri;
    include snippets/ssl-params.conf;
}

server {
    listen 443 ssl http2;
    server_name www.example.com;
    include snippets/ssl-params.conf;
    client_max_body_size 5G;
    location / {
        proxy_pass http://127.0.0.1:8888;
    }
}

我最终通过为没有www的版本添加显式重定向解决了这个问题,但仍然好奇为什么我需要这样做,而没有www代理的版本通过了?