Nginx:如何仅将主域与server_name匹配



我的目标是将example.com重定向到www.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,则:

CCD_ 9被重定向到CCD_。

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

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

TD;TR

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

你需要有一个子域的特定规则:

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

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

尝试使用几个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">
  3. 以星号结尾的最长通配符名称,例如"mail.*">
  4. 第一个匹配的正则表达式(按配置文件中的出现顺序(

相关内容

  • 没有找到相关文章

最新更新