1

我的目标是重定向example.comwww.example.com而不将任何子域重定向到www.

这就是我所拥有的:

server {
  listen 443;
  server_name example.com;
  return 301 https://www.$server_name$request_uri;
}

使用此配置,每个子域(例如:)foo.example.com都会重定向到www.example.com,而不仅仅是没有子域(example.com)的主域,正如我所希望的那样。

我尝试清理缓存(也可以从其他浏览器执行),结果相同。

编辑:

与子域匹配的证据server_name是,如果我将重定向 url 更改为:https://www.$host$request_uri然后:

foo.example.com被重定向到www.foo.example.com.

4

2 回答 2

1

尝试使用几个server_name指令:

server {
  listen 443;
  server_name example.com;
  return 301 https://www.$server_name$request_uri;
}

server {
  listen 443;
  server_name ~^(?<name>\w+)\.example\.com$;
  
  ... # insert your directives (location etc.)
}

nginx文档中所述:

当按名称搜索虚拟服务器时,如果名称匹配多个指定变体,例如通配符名称和正则表达式匹配,则将选择第一个匹配的变体,按以下优先顺序:

  1. 确切名称
  2. 以星号开头的最长通配符名称,例如“*.example.org”</li>
  3. 以星号结尾的最长通配符名称,例如“mail.*”</li>
  4. 第一个匹配的正则表达式(在配置文件中的出现顺序)
于 2020-11-08T19:48:01.560 回答
1

实际上,example.com只匹配主域。

但是如果hostname不匹配任何server_name(在您的示例中,您的子域不匹配,因为主域只有一个服务器规则),则将使用默认服务器如果您没有使用default_server标签指定它在 listen 参数中,它默认使用第一个 server,在您的情况下,它是主域的重定向规则。

TD;TR

您的子域不匹配任何规则,因此它们被回调到您设置的唯一规则,即重定向。

您需要为子域制定特定规则:

server {
  listen 443;
  server_name *.example.com;
  # do something, or leave it blank for default nginx page
}

这将阻止子域使用默认服务器,因此被重定向到www,但它们没有被配置为什么都不做,因此将显示默认的 nginx 页面。我建议直接为每个子域指定您想要的行为,或者将注释替换为所有子域的实际预期行为。

于 2020-11-08T20:09:39.530 回答