基于非路径的nginx url重写

基于非路径的nginx url重写,nginx,Nginx,我目前正在使用openshift托管多个应用程序,我希望能够使用nginx处理所有路由。假设我拥有域https://project.us.company.comopenshift上的应用程序如下所示: https://foo-v1-project.eocp-apps.us.company.com https://foo-v2-project.eocp-apps.us.company.com https://project.us.company.com/bar/test --> https

我目前正在使用openshift托管多个应用程序,我希望能够使用nginx处理所有路由。假设我拥有域
https://project.us.company.com
openshift上的应用程序如下所示:

https://foo-v1-project.eocp-apps.us.company.com
https://foo-v2-project.eocp-apps.us.company.com
https://project.us.company.com/bar/test --> https://bar-v2-project.eocp-apps.us.company.com/test
我希望能够执行
反向代理
并像这样重写:

https://project.us.company.com/foo/v1/test         -> https://foo-v1-project.eocp-apps.us.company.com/test
https://project.us.company.com/foo/v2/test1        -> https://foo-v2-project.eocp-apps.us.company.com/test1
https://project.us.company.com/bar/v1/test?limit=5 -> https://bar-v1-project.eocp-apps.us.company.com/test?limit=5 
https://project.us.company.com/bar/v2/test/test2   -> https://bar-v2-project.eocp-apps.us.company.com/test/test2
我还需要一些逻辑,使其像这样工作:

https://foo-v1-project.eocp-apps.us.company.com
https://foo-v2-project.eocp-apps.us.company.com
https://project.us.company.com/bar/test --> https://bar-v2-project.eocp-apps.us.company.com/test
因此,如果没有版本,它应该默认为一个值(
v2

# Assuming only three apps for now: foo, bar, baz

location ~ ^/((?:foo|bar|baz)(?:/v[0-9]+)?)$ {
    return 301 /$1/;
}

rewrite ^/(foo|bar|baz)/((?:[^v].*|v[^_0-9].*|v[0-9]+(?:[^/0-9].*)?|v_(?:[^/].*)?)?)$ /$1/v_/$2;

# different default versions
rewrite /foo/v_/(.*) /foo/v2/$1 last;
rewrite /bar/v_/(.*) /bar/v4/$1 last;
rewrite /baz/v_/(.*) /baz/v8/$1 last;

location ~ /(foo|bar|baz)/(v[0-9]+)(/.*) {
    proxy_pass https://$1-$2-project.eocp-apps.us.company.com$3
}

是的,这很有效,谢谢!如果你做了
/foo/v
/foo/v\uu
,唯一不起作用的就是边缘案例。我还添加了
$is_args$args
以在需要时传递查询参数。。。哦,等等。正确的。好的,我可以修理那些边缘的箱子。