nginx 为除一个域之外的所有域提供服务

nginx 为除一个域之外的所有域提供服务

我在 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 感到困惑。

相关内容