【问题标题】:Nginx map for part of URIURI 部分的 Nginx 映射
【发布时间】:2019-11-15 09:43:30
【问题描述】:

我想要一个像

这样的映射
map $name $id {
    Bob 1;
}

(方案+域名为$scheme://$host)。

我想将/$name/foo 重定向到/bar?param=$id

我该怎么做?在示例中,我只在地图中看到完整的 URI。我宁愿没有

map $uri $mapped_uri {
    /Bob/foo /bar?param=1;
    /Joe/foo /bar?param=2;
}

因为那会复制硬编码的部分。

【问题讨论】:

    标签: nginx


    【解决方案1】:

    您可以使用 anther map 来捕获 $name 变量。这些发生在周期的早期,可以帮助避免在您的配置扩展时可能导致问题的正则表达式位置。

    map $uri $name {
        ~^/([^/]+)/foo$ $1;
    }
    
    map $name $id {
        Bob 1;
        Joe 2;
    }
    
    server {
        if ($id) {
            return 302 /bar?param=$id;
        }
    }
    

    【讨论】:

    • 很好的解决方案!如果请求来自map $uri $name,但没有相应的条目,如果我需要重定向到某个 URL,你会建议什么?我不认为默认的魔法值是一个好主意,因为这可能是将来的有效值。
    • 这比我的更优雅的解决方案,我没有摔倒使用两个map 指令,+1
    • @onepiece 在第一个 if 块之后,您可以使用第二个:if ($name) { return 302 some_url_for_unknown_name; }。如果$id 变量为空(第二个map 表中没有对应的名称),但$name 不为空(请求URI 满足第一个map 正则表达式),它将被处理。
    【解决方案2】:

    例如:

    map $name $id {
        Bob 1;
        Joe 2;
        ...
        default "some_value_for_unknown_name";
    }
    
    server {
        ...
        location ~ ^/([^/]+)/foo$ {
            set $name $1;
            rewrite ^ /bar?param=$id last;
        }
        ...
    }
    

    具有硬编码的预定义名称集的更严格的版本可能类似于location ~ ^/(Bob|Joe|...)/foo$ { ... }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-24
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      • 2014-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多