我想使用以下四个规则为当前服务的端点创建一个位置正则表达式。
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>.*)(/.*)*$" {
...
}
我尝试过的解决方案都没有奏效。有什么想法吗?
答案 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
。