我在 ubuntu 12.04 上安装了标准 nginx。我只想为一个子域提供服务。所有其他子域都应返回 404。
我定义了两个站点:
0-默认:
server {
listen *:80 default_server;
listen [::]:80 default_server ipv6only=on;
listen *:443 default_server ssl;
listen [::]:443 default_server ssl ipv6only=on;
return 404;
ssl_certificate /etc/nginx/ssl/mydomain.com.pem;
ssl_certificate_key /etc/nginx/ssl/mydomain.com.key;
server_name _ *.mydomain.com mydomain.com;
}
1-站点:
server {
listen sub.mydomain.com:443;
ssl on;
ssl_certificate /etc/nginx/ssl/sub.mydomain.com.pem;
ssl_certificate_key /etc/nginx/ssl/sub.mydomain.com.key;
root /var/www/sub;
index index.html index.htm;
server_name sub.mydomain.com;
}
但 1-site 不仅在端口 443 上为所有域名提供服务sub.mydomain.com并且不由 0-default 提供服务。
我怎样才能实现想要的行为?
答案1
现在我有一个解释。
您的 1 站点服务器监听ip:port
而默认站点仅监听port
。当 nginx 选择使用哪个服务器块时,它会优先选择最接近的匹配项,并且ip:port
比 更匹配port
。只有在筛选之后,nginx 才会比较服务器名称,但在这种情况下为时已晚。它已经只有一个候选者了。
在您监听语句对齐之后,它们都与请求“等距”。
答案2
我可以通过调整监听语句来解决这个问题。
因此我的监听语句现在如下所示:
0-默认:
listen 80 default_server;
listen 443 default_server ssl;
1-站点:
listen 443;
listen 语句中的子域名似乎让 nginx 感到困惑。