nginx www重定向到带有子域的非www

时间:2017-02-03 09:04:34

标签: redirect nginx

如何为此规则从www重定向到非www?^(?\ w +)。example.com?

server {
    listen 80;
    listen [::]:80 ipv6only=on;
    server_name ~^(?<subdomain>\w+)\.example\.com$;
}

我尝试单独的主域重定向和所有子域重定向,但具有主域的递归重定向。

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。

1 个答案:

答案 0 :(得分:0)

要记住的一件事是,如果nginx找不到匹配的server_name,它将使用默认服务器。除非您定义default_server,否则它将使用侦听相应端口的第一个server块。有关详细信息,请参阅this document

显然example.com与正则表达式~^(?<subdomain>\w+)\.example\.com$不匹配,但是,您当前的server块有效,因为它是隐式默认服务器。

正则表达式server块按顺序进行评估,因此请先放置www.规则,以便www.example.com不被视为子域。

明确显示主server块的默认值,以便继续处理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$;
    ...
}