我正在尝试通过 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;
}
}