当ssl和http2打开时,Nginx似乎忽略server_name

时间:2016-10-18 12:01:30

标签: 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;
    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的版本才能工作。参数server_name似乎没有任何效果。我正在使用" nginx版本:nginx / 1.10.1"。

1 个答案:

答案 0 :(得分:3)

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

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

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

实际上,如果删除server指令,您可能会将其滚动到端口80 server_name块中:

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;
    }
}