nginx位置正则表达式多个元素

时间:2018-11-23 13:57:23

标签: regex nginx

我想使用以下四个规则为当前服务的端点创建一个位置正则表达式。

location ~* ^/api/(?<version>.*)/(?<service>.*)(/.*/.*/.*/.*)$ {
...
}

location ~* ^/api/(?<version>.*)/(?<service>.*)(/.*/.*/.*)$ {
...
}

location ~* ^/api/(?<version>.*)/(?<service>.*)(/.*/.*)$ {
...
}

location ~* ^/api/(?<version>.*)/(?<service>.*)(/.*)$ {
...
}

这允许使用以下路由访问我的API:

https://myapp.mydomain.com/api/v1/anyservice/foo
https://myapp.mydomain.com/api/v2/anyservice/foo/bar
https://myapp.mydomain.com/api/v1/anotherservice/foo/bar/thingy
https://myapp.mydomain.com/api/v1/anotherservice/foo/bar/thingy/owl

我尝试了许多解决方案。例如:

location ~* "^/api/(?<version>.*)/(?<service>.*)(/.*){1,4}$" {
...
}

location ~* "^/api/(?<version>.*)/(?<service>.*)(/.*)*$" {
...
}

我尝试过的解决方案都没有奏效。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您可以使用此正则表达式实现目标:

/api/(?<version>[^/]+)/(?<service>[^/]+)(?:/[^/]+){1,4}$

如果文本包含多行(如上述示例),则必须设置'multiline'选项。

正则表达式开始与'/api/'相匹配(请注意,您所使用的'^'符号已删除,因为它不是行首)。

然后,它创建一个与任何字符'version'匹配的命名组not being a slash,然后匹配一个slash和一个新的命名组'service。再次匹配任何字符not being a slash

然后,它创建一个非捕获组,匹配slash后跟任意字符not being a slash。该组与from 1 to 4 times相匹配。

修改

要匹配组中的path,我已更改为包括一个名为'path'的命名组:

/api/(?<version>[^/]+)/(?<service>[^/]+)(?<path>(?:/[^/]+){1,4})$

现在,您将在'path'组中找到路径。

答案 1 :(得分:1)

我不知道我是否正确理解了您的问题,但是此RegEx可能会解决它。

.*\/api\/(v\d)\/(.+service)(\/.+\/?)*

它与每个给定的示例匹配。

Group 1中,它捕获了Version

Group 2中,它捕获了Service

Group 3中,它捕获了/foo