在Nginx地图指令

时间:2016-07-20 19:52:36

标签: nginx

这是此问题的更新版本。 (我从来没有问过这里的问题,所以我不能对原文发表评论)

Variable interpolation inside Map directive

根据文档,现在允许使用字符串和变量的组合。如下所示:http://nginx.org/en/docs/http/ngx_http_map_module.html#map

在这里:https://trac.nginx.org/nginx/ticket/663

  

结果值可以包含文本,变量(0.9.0)及其组合(1.11.0)。

但是我仍然无法让它发挥作用。

我们有大量的重定向,根据以下建议,我尝试使用map指令实现它们。 https://serverfault.com/questions/450325/nginx-and-try-files-try-named-location-with-rewrites-before-fallback

以下是一个示例映射:

map $uri $redirect {
    /wrong/path /right/path/;
    ~^/another/wrong/path/(?<path>.*)$ /another/right/path/$path;
}

这将返回文字字符串/another/right/path/$path

这很好用:

map $uri $redirect {
    /wrong/path /right/path/;
     ~^/another/wrong/path/(?<path>.*)$ $path
}

所以我知道变量不是问题所在。

有没有人知道如何在map指令中将字符串与变量结合起来?我在这里缺少什么?

我的版本是1.11.2

1 个答案:

答案 0 :(得分:0)

您可以将字符串组合为以下示例。

map $host $_env_right_url {
  default right-path.com;
}

map $uri $redirect_uri {
    ~^/wrong/path/?$ https://$_env_right_url/rightPath;
    ~^/second/wrong/path/?$ https://$_env_right_url/second/rightPath;
}

server {
    listen 80;
    server_name WRONG-path.com;

    location / {
        try_files $uri $uri/ @redirect-map;
    }

    location @redirect-map {
        if ($redirect_uri) {  # redirect if the variable is defined
            return 301 $redirect_uri;
        }
    }
}