如何使用 nginx 删除子域而不硬编码 URL?

问题描述 投票:0回答:2

我有这个域结构,需要进行一些重定向,例如:

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)。我怎样才能获得该点之前的零件并在新地址处置?

nginx url-rewriting
2个回答
0
投票

阅读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;
}

0
投票

回答有点晚了,最后在Ivan的帮助下我做出了这个正则表达式。我用它定义了一个站点,如果请求落在该站点上,nginx 将删除该子域。

 if ($host ~ "^[^.]+\.(?<domain>[^.]+\..+)$") {
      rewrite ^ $scheme://$domain$request_uri permanent;
 }
© www.soinside.com 2019 - 2024. All rights reserved.