Внутри виртуальной службы я проложил 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.
Я даже проверил на регулярное выражение101, что этот путь действительно соответствует используемому мной регулярному выражению.
Кроме того, шлюз успешно направляет запрос, когда я использую регулярное выражение /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