在我的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
答案 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;
}
在此之前似乎运行正常