Nginx永久重定向到某个子目录的不同url

时间:2017-09-27 09:20:11

标签: nginx subdomain

我有2台Nginx服务器提供来自未知父域的2个不同子域的静态文件,比方说<env>.foo.<domain>.com<env>.bar.<domain>.com

我想为<env>.foo.<domain>.com配置nginx服务器,以便如果网址包含子目录catdog,我想重定向到<env>.bar.<domain>.com/<subdirectory>/<rest of url>

E.g。

http://dev.foo.mydomain1.com/cat/22 -> http://dev.bar.mydomain1.com/cat/22
http://dev.foo.mydomain1.com/dog/22 -> http://dev.bar.mydomain2.com/dog/22
http://dev.foo.mydomain2.com/dog/22 -> http://dev.bar.mydomain2.com/dog/22
http://dev.foo.mydomain1.com/bird/22 -> [no redirect]

域的<env><domain>部分是动态的,具体取决于部署服务器的环境,但在2个nginx框之间是通用的。

我想它就像:

server {
  location ??? /(cat|dog) {
    return 301 $scheme://???/$1$is_args$query_string;
  }
}

但我的nginx技能并不完全......

2 个答案:

答案 0 :(得分:3)

{{1}}

有关详细信息,请参阅digital oceans's article“如何使用Nginx创建临时和永久重定向”。

答案 1 :(得分:0)

你可以做的是

http {

map $http_host $host_to_send_to {
  default $http_host;
  dev.foo.mydomain1.com    dev.bar.mydomain1.com;
  dev.foo.mydomain2.com    dev.bar.mydomain2.com;
}

server {
  server_name dev.foo.mydomain1.com;
  location /(cat|dog) {
    return 301 $scheme://$host_to_send_to$request_uri$is_args$query_string;
  }
}
}

您需要将其添加到需要处理重定向的每个服务器块。

编辑-1:动态主机名处理

您可以动态处理主机名,也可以用户重新设置模式和组

map $hostsname $host_to_send_to {
  default $http_host;
  ~(.*).foo.mydomain1.com    $1.bar.mydomain1.com;
  ~(.*).foo.mydomain2.com    $1.bar.mydomain2.com;
}