在虚拟服务内,我已将 2 条路径路由到我的服务,如下 -
- match:
- uri:
prefix: /jaeger/
- uri:
regex: \/oauth2\/.*jaeger.*
route:
- destination:
host: oauth2-proxy
port:
number: 80
但是当我在路径上发送请求时网关返回404
/oauth2/callback?code=3QxQLUqCwxVtH_GS6mWteICfisIe32yE7RE6wQIZZVw&state=wmZSZ0BHMHq3vmS_1YBWIn72pG6FkChFQbNUNipGotQ%3A%2Fjaeger%2F
现在,我也可以使用前缀
/oauth2/
来处理此类 URL,但目前我有多个应用程序正在由它们自己的 oauth2 代理进行身份验证,并且此正则表达式将匹配所有这些应用程序。所以我需要使用一个正则表达式,其中包含应用程序名称,例如 jaeger 就是这种情况。
我什至检查了regex101,该路径确实与我使用的正则表达式匹配。
此外,当我使用正则表达式
\/oauth2\/.*
时,网关成功路由请求。但正如我所解释的,我也不能使用这个正则表达式。我在这里错过了什么吗?
编辑: 经过进一步测试,我发现如果去掉“?”从该路径中,istio 接受该路径为有效并将请求转发到服务。 我也尝试了正则表达式
/oauth2\/callback\?code=.*jaeger.*
,但这也不起作用。
我没有意识到“?”标记 URL 的结尾,之后的所有内容都是查询参数。 Istio 还提供查询参数的匹配。以下代码适用于我的情况 -
- match:
- uri:
prefix: /jaeger/
- uri:
regex: \/oauth2\/callback\?.*
queryParams:
state:
regex: .*jaeger.*
route:
- destination:
host: oauth2-proxy
port:
number: 80