URI部分的NginxMap

chhkpiq4  于 2023-01-25  发布在  Nginx
关注(0)|答案(3)|浏览(148)

我需要一个Map

map $name $id {
    Bob 1;
}

(方案+域为$scheme://$host)。
我想将/$name/foo重定向到/bar?param=$id
我该怎么做?在示例中,我只能在Map中看到完整的URI。我不希望

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

因为这将复制硬编码部分。

cdmah0mi

cdmah0mi1#

你可以使用另一个Map来捕获$name变量,这在周期的早期发生,可以帮助避免正则表达式位置,当你的配置扩展时,这会导致问题。

map $uri $name {
    ~^/([^/]+)/foo$ $1;
}

map $name $id {
    Bob 1;
    Joe 2;
}

server {
    if ($id) {
        return 302 /bar?param=$id;
    }
}
aiazj4mn

aiazj4mn2#

例如:

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$ { ... }

klsxnrf1

klsxnrf13#

仅供参考,使用科尔Tierney的Anwser修改。我需要剥离URI的开头。

map $request_uri $request_uri_path {
    ~^(?:/v2)?(.*)$ $1;
}

server {
    location /v2 {
        proxy_pass http://127.0.0.1$request_uri_path;
    }
}

正则表达式以可选的“/v2”开头,并且只使用其后的所有内容,因此/v2/example. js将变为/example. js。

相关问题