我想使用以下四条规则为我当前服务的端点创建一个位置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 slash
的slash
。此组与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
。