为什么监听`443 default_server ssl`适用于nginx中的多个服务器名称?

Mic*_*ick 5 ssl nginx

我为静态内容运行nginx,并作为Apache/mod_wsgi服务django的代理.我有example.com和test.example.com作为Apache/Django和static.example.com的代理,它直接通过nginx提供所有静态文件.我有一个通配符SSL证书,因此每个子域都可以使用SSL(我只有一个IP).

为什么使用时listen 443 default_server ssl; test.example.com example.com,SSL适用于这两种但我必须明确地听443 static.example.com?

ssl_certificate         /etc/ssl/certs/example.chained.crt;
ssl_certificate_key     /etc/ssl/private/example.key;

server {
    listen      80;
    listen      443;
    server_name static.example.com;
    # ... serves content ...
}

server {
    listen       80;
    listen      443 default_server ssl;
    server_name  example.com;
    # ... proxy pass to http://example.com:8080 (apache) ...
}
server {
    listen      80;
    # why don't I need `listen 443;` here?
    server_name test.example.com;
    # ... proxy pass to http://test.example.com:8080 (apache) ...
}
Run Code Online (Sandbox Code Playgroud)

Luk*_*uke 3

SSL 协议本身(不带SNI扩展)使用服务器的 IP 地址来请求 SSL 证书。对于 SNI,它还传递主机名(不适用于 Win XP),但这与此无关。

服务器指令不完全匹配。这是“最接近”的比赛。它可能看起来“有效”,但最终可能会出现错误的服务器指令。如果没有更多信息(例如服务器根),很难判断。

关键是某些东西总是有效,因为你似乎使用的是单个 IP 地址。