Nginx www重定向到具有子域的非www
对于该规则〜^(?\ w +).example.com,我如何从www重定向到非www?
How can i redirect from www to non www for this rule ~^(?\w+).example.com ?
server {
listen 80;
listen [::]:80 ipv6only=on;
server_name ~^(?<subdomain>\w+)\.example\.com$;
}
我尝试单独的主域重定向和所有子域重定向,但是对主域具有递归重定向.
I try separate main domain redirect and all subdomains redirect but have recursive redirection for main domain.
server {
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
}
server {
server_name "~^www\.(.*)$" ;
return 301 $scheme://$1$request_uri ;
}
然后我只能尝试
server {
server_name "~^www\.(.*)$" ;
return 301 $scheme://$1$request_uri ;
}
,并且适用于子域.但是在主域中,我可以重定向为$ request_uri,而没有域.
and that work for subdomains. But in main domain i have redirect for $request_uri without domain.
要记住的一件事是,如果nginx
找不到匹配的server_name
,它将使用默认服务器.而且,除非您定义default_server
,否则它将使用第一个server
块在适当的端口上进行侦听.有关详细信息,请参见本文档.
One thing to remember is that if nginx
cannot find a matching server_name
it will use the default server. And unless you define a default_server
, it will use the first server
block listening on the appropriate port. See this document for details.
很明显example.com
与正则表达式~^(?<subdomain>\w+)\.example\.com$
不匹配,但是,您当前的server
块是有效的,因为它是隐式默认服务器.
Clearly example.com
does not match the regular expression ~^(?<subdomain>\w+)\.example\.com$
, however, your current server
block works because it is the implicit default server.
正则表达式server
块是按顺序求值的,因此请首先放置www.
规则,以使www.example.com
不被视为子域.
Regular expression server
blocks are evaluated in order, so place the www.
rule first so that www.example.com
is not treated as a subdomain.
显式地将主server
块设置为默认,以便其继续处理example.com
.
Make the main server
block default explicitly so that it continues to handle example.com
.
server {
server_name "~^www\.(.*)$" ;
return 301 $scheme://$1$request_uri ;
}
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
server_name ~^(?<subdomain>\w+)\.example\.com$;
...
}