如何在 Istio VirtualService 正则表达式中实现逻辑或?
How to achieve logical OR in an Istio VirtualService regex?
问题
管道字符在 Istio 中似乎不起作用 VirtualService
。
下面的示例旨在根据 user-agent
header 路由请求。来自移动设备的请求应转到 myapp
,来自桌面用户的请求应转到 deskt-app
,由下一个匹配块处理。 <REGEX>
字段在我使用此正则表达式时有效:
^.*\bMobile\b.*$
但是这种能力需要更复杂的正则表达式来识别移动用户。当我使用这些时,我的路由完全中断:
^.*\b(iPhone|Pixel)\b.*$
^.*\b(iPhone|Pixel)+\b.*$
^.*\biPhone|Pixel\b.*$
预期行为
使用带管道的正则表达式(逻辑或) 当我有一个 user-agent
header 包含单词 "iPhone" 或"Pixel".
实际行为
我被路由到 deskt-app
。
问题
如何在 Istio VirtualService
正则表达式模式中实现逻辑或?那是我的问题还是我忽略了一些明显的东西?
示例VirtualService
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
...
...
http:
- match:
- headers:
user-agent:
regex: "<REGEX>" <------
uri:
prefix: /foo/bar
route:
- destination:
host: myapp
port:
number: 80
- match:
- uri:
prefix: /foo/bar
route:
- destination:
host: deskt-app
port:
number: 80
编辑:Github Issue
你的配置是正确的,所以肯定是regex的问题,或者user-agent的内容不一样,试一试'^.*(iPhone|Pixel).*$'
刚刚验证当 header 包含 android 或 iphone 时下面的配置路由正确:
- match:
- headers:
user-agent:
regex: '^.*(Android|iPhone).*$'
并测试了:
[匹配] curl -H "user-agent: Mozilla/5.0 (Linux; U; iPhone 4.4.2; en-us;)" ...
[不匹配] curl -H "user-agent: Mozilla/5.0 (Linux; U; Iphne 4.4.2; en-us;)" ...
问题
管道字符在 Istio 中似乎不起作用 VirtualService
。
下面的示例旨在根据 user-agent
header 路由请求。来自移动设备的请求应转到 myapp
,来自桌面用户的请求应转到 deskt-app
,由下一个匹配块处理。 <REGEX>
字段在我使用此正则表达式时有效:
^.*\bMobile\b.*$
但是这种能力需要更复杂的正则表达式来识别移动用户。当我使用这些时,我的路由完全中断:
^.*\b(iPhone|Pixel)\b.*$
^.*\b(iPhone|Pixel)+\b.*$
^.*\biPhone|Pixel\b.*$
预期行为
使用带管道的正则表达式(逻辑或) 当我有一个 user-agent
header 包含单词 "iPhone" 或"Pixel".
实际行为
我被路由到 deskt-app
。
问题
如何在 Istio VirtualService
正则表达式模式中实现逻辑或?那是我的问题还是我忽略了一些明显的东西?
示例VirtualService
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
...
...
http:
- match:
- headers:
user-agent:
regex: "<REGEX>" <------
uri:
prefix: /foo/bar
route:
- destination:
host: myapp
port:
number: 80
- match:
- uri:
prefix: /foo/bar
route:
- destination:
host: deskt-app
port:
number: 80
编辑:Github Issue
你的配置是正确的,所以肯定是regex的问题,或者user-agent的内容不一样,试一试'^.*(iPhone|Pixel).*$'
刚刚验证当 header 包含 android 或 iphone 时下面的配置路由正确:
- match:
- headers:
user-agent:
regex: '^.*(Android|iPhone).*$'
并测试了:
[匹配] curl -H "user-agent: Mozilla/5.0 (Linux; U; iPhone 4.4.2; en-us;)" ...
[不匹配] curl -H "user-agent: Mozilla/5.0 (Linux; U; Iphne 4.4.2; en-us;)" ...