nginx从主域到子域重写规则

时间:2015-02-04 14:54:18

标签: nginx rewrite

在我的nginx domain.cong中,我写了以下重写规则...... 当请求到达主域(有或没有www)时,它会重定向到博客子域,但它似乎是错误的......

server {
....
##### Rewrite rules for domain.tld => www.domain.tld #####
if ($host ~* ^([^.]+\.[^.]+)$) {
    set $host_without_www $1;
    rewrite ^(.*) $scheme://www.$host_without_www$1 permanent;
}

##### Rewrite rules for www.domain.tld => subdomain.domain.tld #####
if ($host ~* 'www\.[^.]+\.[^.]+$')  {
    set $host_without_www $1.$2;
    rewrite ^(.*) $scheme://subdomain.$host_without_www$1 permanent;
} 
...
} 

第一条规则是正确的:
domain.tld => www.domain.tld
但不是第二个只给出了 www.domain.tld => subdomain.
应该是 www.domain.tld => subdomain.domain.tld

2 个答案:

答案 0 :(得分:7)

您的设置似乎有点过于复杂,如果"那么匹配$ host的最佳做法并非最佳做法。 如果您只有一个域,那很简单:

server {
    # ...
    server_name domain.tld www.domain.tld;
    return 301 $scheme://subdomain.domain.tld$request_uri;
}

server {
    server_name subdomain.domain.tld;
    # ...
}

如果你有很多域,设置类似,只需在server_name上使用正则表达式和捕获变量

答案 1 :(得分:0)

我想我找到了解决方案,修改了第二次重写规则:

##### Rewrite rules for www.domain.tld => subdomain.domain.tld #####
if ($host ~* www\.(.*)) {
  set $host_without_www $1;
   rewrite ^(.*)$ http://subdomain.$host_without_www$1 permanent;
}

在此之前似乎运行正常