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

标签 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”。

最佳答案

除非您为端口 443 显式定义默认服务器,否则 nginx 将使用第一个匹配的 server block 来处理请求。参见 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 block 中:

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

关于ssl - 当 ssl 和 http2 打开时,Nginx 似乎忽略了 server_name,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40107732/

相关文章:

java - 使用 Java/SpringBoot 为 token 绑定(bind)协议(protocol)协商启用 TLS 扩展

python - 我应该为 Flask、uWSGI 和 nginx 提供单独的容器吗?

Django、Nginx、Gunicorn 静态文件不工作

c++ - 来自自定义库的 Openssl 和 gsoap

golang autocert acme/autocert : missing server name

php - Unity + PHP + SSL + Https + 黑客

ruby-on-rails - 从 Rails 应用程序中重新加载 nginx 配置

Nginx RTMP模块生成HLS

非默认端口上的反向代理背后的 Spring Boot Cors

ssl - 用于演示的 Identity Server 4 星 ssl 证书