【问题标题】:Nginx seems to ignore server_name when ssl and http2 is on当 ssl 和 http2 打开时,Nginx 似乎忽略了 server_name
【发布时间】:2016-10-18 12:01:30
【问题描述】:

我有这个 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”。

【问题讨论】:

  • 我最终通过为不带 www 的版本添加显式重定向来解决此问题,但仍然很好奇为什么我需要这样做并且不通过 www 代理的版本?

标签: ssl nginx


【解决方案1】:

除非您为端口 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_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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2021-10-28
    • 2016-09-30
    • 2016-03-16
    • 2014-02-03
    相关资源
    最近更新 更多