Quando as URLs externas diferem dos caminhos internos do serviço, as requisições recebidas não alcançam os endpoints de backend corretos. Uma política de reescrita modifica o caminho ou o hostname nas requisições antes que o gateway nativo da nuvem as encaminhe aos serviços de backend — por exemplo, removendo um prefixo de versão como /v1 ou roteando o tráfego para um host diferente durante uma migração.
Como funcionam as políticas de reescrita
Os gateways nativos da nuvem oferecem suporte a duas categorias de reescrita:
Reescrita de caminho: altera o caminho da URL. Três métodos estão disponíveis: reescrita exata, reescrita de prefixo e reescrita regex.
Reescrita de host: altera o hostname. Somente a reescrita exata tem suporte.
Compatibilidade dos métodos de reescrita
Cada método de reescrita exige um tipo específico de correspondência de rota. Antes de configurar uma política de reescrita, verifique se a rota utiliza um tipo de correspondência compatível.
|
Tipo de correspondência de rota |
Métodos de reescrita compatíveis |
|
Exact Match |
Exact Rewrite |
|
Prefix Match |
Prefix Rewrite, Regex Rewrite |
|
Regex Match |
Exact Rewrite, Regex Rewrite |
Métodos de reescrita de caminho
Reescrita exata
A reescrita exata substitui todo o caminho da requisição por um novo caminho.
Exemplo: reescrever /app/test para /foo/bar
|
Configuração |
Valor |
|
Tipo de correspondência de rota |
Exact Match |
|
Caminho da rota |
|
|
Método de reescrita |
Exact Rewrite |
|
Caminho de destino |
|
A reescrita exata funciona apenas com os tipos de correspondência de rota Exact Match ou Regex Match. Ela não é compatível com Prefix Match.
Reescrita de prefixo
A reescrita de prefixo substitui apenas a parte correspondente ao prefixo no caminho da requisição. O restante do caminho permanece inalterado.
Exemplo 1: remover o prefixo /app — reescrever /app/test para /test
|
Configuração |
Valor |
|
Tipo de correspondência de rota |
Prefix Match |
|
Caminho da rota |
|
|
Método de reescrita |
Prefix Rewrite |
|
Caminho de destino |
|
A barra final em /app/ é obrigatória. A reescrita de prefixo substitui apenas o prefixo correspondente. Se você definir o caminho da rota como /app (sem a barra final), o caminho reescrito se tornará //test, o que é inválido.
Exemplo 2: trocar um prefixo de versão — reescrever /v1/test para /v2/test
|
Configuração |
Valor |
|
Tipo de correspondência de rota |
Prefix Match |
|
Caminho da rota |
|
|
Método de reescrita |
Prefix Rewrite |
|
Caminho de destino |
|
A reescrita de prefixo funciona apenas com o tipo de correspondência de rota Prefix Match. Todas as requisições cujo caminho começa com o prefixo especificado são correspondidas e reescritas; portanto, confirme se essa reescrita abrangente é realmente desejada. Para reescrever apenas caminhos específicos, utilize a reescrita exata.
Reescrita regex
A reescrita regex usa uma expressão regular para corresponder e substituir partes do caminho da requisição. A configuração de reescrita regex possui dois parâmetros:
Mode: o padrão regex que identifica as partes do caminho a serem substituídas.
Replacement: a string de substituição que substitui as partes correspondentes.
O gateway utiliza a sintaxe de expressões regulares RE2. Para testar padrões antes de aplicá-los, use uma ferramenta online como o Regex101 (selecione o flavor Golang, que usa RE2).
Exemplo 1: substituição global — reescrever /aaa/one/bbb/one/ccc para /aaa/two/bbb/two/ccc
|
Configuração |
Valor |
|
Tipo de correspondência de rota |
Exact Match |
|
Caminho da rota |
|
|
Método de reescrita |
Regex Rewrite |
|
Mode |
|
|
Replacement |
|
Exemplo 2: reordenação de grupos de captura — para requisições que correspondem a /httpbin/(.*)/(.*), remova o prefixo /httpbin e troque os dois segmentos capturados de lugar.
|
Configuração |
Valor |
|
Tipo de correspondência de rota |
Regex Match |
|
Caminho da rota |
|
|
Método de reescrita |
Regex Rewrite |
|
Mode |
|
|
Replacement |
|
Na string de substituição, \1 refere-se ao primeiro grupo de captura e \2 refere-se ao segundo. Eles equivalem a $1 e $2 no NGINX Ingress.
A reescrita regex é o método mais complexo. Quando uma reescrita exata ou de prefixo mais simples atinge o mesmo resultado, prefira esses métodos.
Reescrita de host
A reescrita de host substitui o hostname na requisição usando o método de reescrita exata.
Exemplo: reescrever o hostname de test.com para dev.com
Defina o campo Destination Host na política de reescrita como dev.com.
Configurar uma política de reescrita
Pré-requisitos
Antes de começar, certifique-se de ter:
Uma instância de gateway nativo da nuvem no MSE
Pelo menos uma rota configurada no gateway
Procedimento
Faça login no console do MSE. Na barra de navegação superior, selecione uma região.
No painel de navegação à esquerda, escolha Cloud-native Gateway > Gateways. Na página Gateways, clique em nome do seu gateway.
No painel de navegação à esquerda, clique em Routes e, em seguida, clique em aba Routes.
Localize a regra de roteamento desejada e clique em Policies na coluna Actions.
-
Na aba Policies, clique em Rewrite no painel de navegação à esquerda. Configure os parâmetros de reescrita e clique em Save. Os métodos de reescrita disponíveis dependem do tipo de correspondência da rota:
Tipo de caminho original
Tipos de caminho de destino disponíveis
Exact Match
Exact Rewrite
Prefix Match
Prefix Rewrite, Regex Rewrite
Regex Match
Exact Rewrite, Regex Rewrite
-
Ative a chave Enable. Na caixa de diálogo de confirmação, clique em OK.
Ativado: o gateway reescreve caminhos e hostnames com base na política configurada antes de encaminhar as requisições aos serviços de backend.
Desativado: o gateway encaminha as requisições sem modificar caminhos ou hostnames.
Verificar o resultado
Este exemplo usa uma reescrita de prefixo para remover o prefixo de roteamento /app1 das requisições externas. O serviço de backend espera caminhos sem esse prefixo, então a política de reescrita mapeia /app1/ para /.
Requisição original (com o prefixo /app1):
curl -I http://121.196.XX.XX/app1/demo/item/list
Após a reescrita (o gateway encaminha a requisição ao backend com o caminho /demo/item/list):
curl -I http://121.196.XX.XX/demo/item/list