使用 nginx 将许多域名重定向到其他域名的不同位置,而无需定义许多服务器块

使用 nginx 将许多域名重定向到其他域名的不同位置,而无需定义许多服务器块

假设我有多个域名变体,其中一个品牌在多个顶级域名注册;并且它们都需要转到一个特定域名+附加与最初请求的域名相关的专用自定义 uri。

例如我有:

  • 域名.tld
  • 域名.net
  • 域名.org
  • 域名.com

在哪里域名.com所有请求都需要在附加额外的 uri 后到达,如下所示:

  • 域名.com/tld
  • 域名.com/net
  • 域名.com/org

我想出了这个工作设置:

# (www.)domain.tld
server {

        listen 80;
        server_name domain.tld www.domain.tld;
        return 301 $scheme://www.domain.com/tld$request_uri;
}

# (www.)domain.net
server {

        listen 80;
        server_name domain.net www.domain.net;
        return 301 $scheme://www.domain.com/net$request_uri;
}

# (www.)domain.org
server {

        listen 80;
        server_name domain.org www.domain.org;
        return 301 $scheme://www.domain.com/org$request_uri;
}


# (www.)domain.com
server {

        listen 80;
        server_name domain.org www.domain.org;

        location / {
               proxy_set_header        Host $host;
               proxy_set_header        X-Real-IP $remote_addr;
               proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
               proxy_pass              http://backend.host:port;
          }

}

但声明多个服务器块虽然合乎逻辑,但看起来过于冗长。

总结 有没有办法实现这种重定向,而不必定义服务器为每个域设置块?

答案1

正则表达式server_name指令可以捕获域名的最后一个元素以用于重定向。例如:

server {
    listen 80;
    server_name ~\.(?<tld>[^.]+)$;
    return 301 $scheme://www.domain.com/$tld$request_uri;
}

这个文件了解详情。

相关内容