Nginx将子域foo重定向到www.foo到www.www.foo等

Nginx将子域foo重定向到www.foo到www.www.foo等,nginx,Nginx,我刚刚将配置从常规证书更改为通配符证书。现在我的nginx行为不端 # redirect http to https server { listen 80 default_server; listen [::]:80 default_server; return 301 https://$host$request_uri; } # redirect naked to www server { listen 443 ssl http2;

我刚刚将配置从常规证书更改为通配符证书。现在我的nginx行为不端

# redirect http to https
server {
  listen      80 default_server;
  listen      [::]:80 default_server;
  return      301 https://$host$request_uri;
}

# redirect naked to www
server {
  listen      443 ssl http2;
  listen      [::]:443 ssl http2;
  server_name example.com;
  include     ssl.conf;
  return      301 https://www.$host$request_uri;
}

# serve subdomain www
server {
  listen      443 ssl http2;
  listen      [::]:443 ssl http2;
  server_name www.example.com;
  include     ssl.conf;
  # ...
}

# serve subdomain mmm
server {
  listen      443 ssl http2;
  listen      [::]:443 ssl http2;
  server_name mmm.example.com;
  include     ssl.conf;
  # ...
}

# ...etc.
上述方法可以工作,但对于不存在的子域(而不是返回404)失败。因此,如果我尝试
notexist.example.com
,它会将我重定向到
www.notexist.example.com
,并给我一个证书警告。如果单击“确定”,它将重定向到
www.www.notexist.example.com
,然后再
www.www.notexist.example.com
,等等


我做错了什么?

既然您想捕获所有不存在的子域,那么您需要在末尾添加一个额外的服务器块,标记为default-like
listen 443 ssl default\u server
此块的
服务器名称
无关紧要-只要它不匹配任何其他服务器块(因此您可以简单地使用
服务器名称


任何尚未由另一个服务器块处理的域都将由默认域处理-您可以重定向到规范域或仅返回404。

您应该在末尾添加一个额外的服务器块并将其标记为默认域-它将捕获尚未由任何其他服务器块处理的所有子域。您不需要为此默认服务器块设置
server\u name
。第二个服务器块错误。
$host
变量被设置为请求的域名,因此
return
语句只是在它前面不断添加另一个
www.
。用法:
return301https://www.$server\u name$request\u uri@RichardSmith谢谢。我试过了,但它重定向到
www
子域。我认为它从
foo.example.com
(它只查看
server\u name
)中剥离子域,然后匹配第二个服务器块,然后重定向到
www.example.com
。如果我遵循@IVOGELOV的想法,在最底层添加一个“一网打尽”的服务器块,这似乎是可行的。@IVOGELOV谢谢。这似乎对我有用!如果你加上答案,我就结束了。