如何在 nginx 中的不同服务器配置中使用或重用相同的映射签名/参数/变量

如何在 nginx 中的不同服务器配置中使用或重用相同的映射签名/参数/变量

我正在尝试通过 nginx 映射完成一些重定向。我为各个域[及其别名]设置了单独的服务器块,例如:

  • www.example.fr
  • www.example.uk
  • www.example.nl

每个都在其 conf 文件中,例如:www.example.fr.conf。

在每个服务器配置文件中,我使用映射设置重定向,因此每个域都有一个[重定向]映射,如下所示:

include france-redirects.conf;
server {
   server_name  www.example.fr example.fr;
   ...
   if ($redirect_uri) {
        return 301 $redirect_uri;
    } 
} 

文件:france-redirects.conf 如下所示:

map $request_uri $redirect_uri {        
    ~/news https://www.example.com/france/latest-news;
    ~/about http://www.example.com/france/about;
}

一切按预期进行:http://www.example.fr/news被重定向到https://www.example.com/france/latest-news

但是,当我为其他域创建类似的配置时,问题就开始了,似乎是我无法使用相同的映射签名/参数/变量:

map $request_uri $redirect_uri {}

在其他服务器配置文件中重复。Nginx 似乎选择第一个映射块 [不确定顺序是什么] 并且只“服从”它。所以当我有:

include netherlands-redirects.conf;
server {
   server_name  www.example.nl example.nl;

   if ($redirect_uri) {
        return 301 $redirect_uri;
    } 
}

使用地图文件 [netherlands-redirects.conf] 如下:

map $request_uri $redirect_uri {        
    ~/news https://www.example.com/netherlands/latest-news;
    ~/about http://www.example.com/netherlands/about;
}

然后我尝试使用 curl 来查看最终的重定向:

curl -Ls -o /dev/null -w %{url_effective} http://www.example.nl/news

它将返回类似这样的内容:

http://www.example.com/france/latest-news

我试图避免将所有重定向集中到一个长文件中,而是根据域进行拆分。这是不可能的,还是我的方法不对?希望我的解释有意义。请帮忙。谢谢

答案1

map指令对所有server块都是全局的。因此您必须使用不同的变量名。例如

map $request_uri $redirect_uri_fr {        
    ~/news https://www.example.com/france/latest-news;
    ~/about http://www.example.com/france/about;
}

map $request_uri $redirect_uri_nl {        
    ~/news https://www.example.com/netherlands/latest-news;
    ~/about http://www.example.com/netherlands/about;
}

并使用它们对应的server块:

include france-redirects.conf;
server {
   server_name  www.example.fr example.fr;
   ...
   if ($redirect_uri) {
        return 301 $redirect_uri_fr;
    } 
} 

include netherlands-redirects.conf;
server {
   server_name  www.example.nl example.nl;

   if ($redirect_uri) {
        return 301 $redirect_uri_nl;
    } 
}

相关内容