我的目标是将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
文件的规定:
按名称搜索虚拟服务器时,如果名称匹配更多指定的变体之一,例如通配符名称和正则表达式匹配,将选择第一个匹配变体,按照以下优先顺序:
- 确切名称
- 以星号开头的最长通配符名称,例如"*.example.org">
- 以星号结尾的最长通配符名称,例如"mail.*">
- 第一个匹配的正则表达式(按配置文件中的出现顺序(