我有这个域结构,需要进行一些重定向,例如:
sub1.sub2.sub3.domain.com/path -> sub2.sub3.domain.com/path
sub2.sub3.domain.com/path -> sub3.domain.com/path
sub1.domain1.com/path1 -> domain1.com/path1
sub2.domain1.com/path2 -> domain1.com/path2
sub3.sub4.domain1.com/path -> sub4.domain1.com/path
sub4.domain.uk.co/path -> sub4.domain1.uk.co/path
sub5.domain6.com/path3 -> domain6.com/path3
sub7.domain6.com/path4 -> domain6.com/path4
sub8.sub8.domain9.com/path5 -> sub8.domain9.com/path5
www.domain9.com/path5 -> domain9.com/path5
“domain.com”“domain6.com”“domain9.com”“domain1.uk.co”不是此服务器中的主机。
我需要重定向而不需要硬编码任何域名。我试试这个:
if ( $host ~ ^www\.(.+)$ ) {
set $without_www $1;
rewrite ^ $scheme://$without_www$uri permanent;
}
但我需要编码“www”(和 subXXX)。我怎样才能获得该点之前的零件并在新地址处置?
阅读this答案(以及整个线程)。如果这样的猜测对您来说没问题(因为国家 TLD 始终是 两个字母,我们可以假设任何
.xx.xx
和 .xxx.xx
域名后缀很可能是某些国家两部分 TLD),您可以使用两个if
块 - 第一个用于检查基域是否具有双组件 TLD,第二个块已显示在评论:
if ($host ~ "\w+\.(?<basedomain>[^.]+\.\w{2,3}\.\w{2})$") {
rewrite ^ $scheme://$basedomain$request_uri permanent;
}
if ($host ~ \w+\.(?<basedomain>[^.]+\.[^.]+)$) {
rewrite ^ $scheme://$basedomain$request_uri permanent;
}
要一一递归地删除子域,您可以尝试以下操作:
if ($host ~ "^[^.]+\.(?<domain>(?!\w{2,3}\.\w{2}$)[^.]+\..+)$") {
rewrite ^ $scheme://$domain$request_uri permanent;
}
回答有点晚了,最后在Ivan的帮助下我做出了这个正则表达式。我用它定义了一个站点,如果请求落在该站点上,nginx 将删除该子域。
if ($host ~ "^[^.]+\.(?<domain>[^.]+\..+)$") {
rewrite ^ $scheme://$domain$request_uri permanent;
}