我需要一个Map
map $name $id { Bob 1; }
(方案+域为$scheme://$host)。我想将/$name/foo重定向到/bar?param=$id。我该怎么做?在示例中,我只能在Map中看到完整的URI。我不希望
$scheme://$host
/$name/foo
/bar?param=$id
map $uri $mapped_uri { /Bob/foo /bar?param=1; /Joe/foo /bar?param=2; }
因为这将复制硬编码部分。
cdmah0mi1#
你可以使用另一个Map来捕获$name变量,这在周期的早期发生,可以帮助避免正则表达式位置,当你的配置扩展时,这会导致问题。
$name
map $uri $name { ~^/([^/]+)/foo$ $1; } map $name $id { Bob 1; Joe 2; } server { if ($id) { return 302 /bar?param=$id; } }
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$ { ... }
location ~ ^/(Bob|Joe|...)/foo$ { ... }
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。
3条答案
按热度按时间cdmah0mi1#
你可以使用另一个Map来捕获
$name
变量,这在周期的早期发生,可以帮助避免正则表达式位置,当你的配置扩展时,这会导致问题。aiazj4mn2#
例如:
具有硬编码预定义名称集的更严格版本可以是
location ~ ^/(Bob|Joe|...)/foo$ { ... }
klsxnrf13#
仅供参考,使用科尔Tierney的Anwser修改。我需要剥离URI的开头。
正则表达式以可选的“/v2”开头,并且只使用其后的所有内容,因此/v2/example. js将变为/example. js。