使用nginx将许多域redirect到其他域的不同位置,而不必定义许多服务器块

假设我有多个域名的变体,一个品牌在多个顶级域名中注册; 他们都需要去一个特定的域名+附加一个专门的自定义URI与原来请求的域相关。

例如,我有:

  • 使用domain.tld
  • domain.net
  • domain.org
  • domain.com

如果domain.com是所有请求都需要登陆的地方,那么附加一个额外的URI就可以了:

  • domain.com/tld
  • domain.com/net
  • domain.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; } } 

但是,多个服务器块的声明,尽pipe是逻辑的,看起来过于冗长。

TL; DR是否有办法完成这种redirect,而不必为每个域定义一个服务器块?

正则expression式server_name指令可以捕获用于redirect的域名的最后一个元素。 例如:

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

详情请参阅此文件 。