nginx位置regex多个元素



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

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>.*)(/.*)*$" {
...
}

我尝试过的解决方案都没有奏效。知道吗?

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

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

如果文本包含多行(如上面的exmaple(,则必须设置'multiline'选项。

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

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

然后,它创建一个非捕获组,匹配后面跟有任何字符not being a slashslash。此组与from 1 to 4 times匹配。

编辑

为了匹配组中的path,我更改为包含一个名为'path':的命名组

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

现在您可以获得'path'组中的路径。

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

.*/api/(vd)/(.+service)(/.+/?)*

它匹配每一个给定的例子。

Group 1中,它捕获Version

Group 2中,它捕获Service

Group 3中,它捕获/foo

最新更新