Configuração de regras de reescrita de URL para ingresses de Nginx
Em alguns cenários de aplicação, o URL de acesso fornecido pelo serviço de back-end é diferente do caminho especificado na regra de ingress. O ingress encaminha diretamente o caminho de acesso para o mesmo caminho de back-end. Se a reescrita de URL não estiver configurada, 404 será retornado para todas as solicitações de acesso. Por exemplo, se o caminho de acesso na regra de ingress estiver definido como /app/demo e o caminho de acesso fornecido pelo serviço de back-end for /demo, as solicitações de acesso serão encaminhadas diretamente para o caminho /app/demo do serviço de back-end, que não corresponde ao caminho de acesso real (/demo) fornecido pelo serviço de back-end. Como resultado, 404 é retornado.
Nesse caso, você pode usar o método Rewrite para implementar a reescrita de URL. Ou seja, você pode usar a anotação nginx.ingress.kubernetes.io/rewrite-target para implementar regras de reescrita para caminhos diferentes.
Configurar regras de reescrita
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-test
namespace: default
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- host: 'rewrite.bar.com'
http:
paths:
- path: '/something(/|$)(.*)'
backend:
service:
name: <your_service_name> # Replace it with the name of your target Service.
port:
number: <your_service_port> # Replace 8080 with the port number of your target Service.
property:
ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
pathType: ImplementationSpecific
ingressClassName: nginx
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-test
namespace: default
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- host: 'rewrite.bar.com'
http:
paths:
- path: '/something(/|$)(.*)'
backend:
serviceName: <your_service_name> # Replace it with the name of your target Service.
servicePort: <your_service_port> # Replace 8080 with the port number of your target Service.

Enquanto rewrite-target é especificado para um ingress, todos os caminhos sob o mesmo host em todas as definições de ingress diferenciam maiúsculas de minúsculas, incluindo os ingresss que não têm rewrite-target especificado.
No exemplo anterior, o espaço reservado $2 indica que todos os caracteres correspondentes ao segundo parêntese (.*) são preenchidos na anotação nginx.ingress.kubernetes.io/rewrite-target.
- rewrite.bar.com/something reescreve para rewrite.bar.com/.
- rewrite.bar.com/something/ reescreve para rewrite.bar.com/.
- rewrite.bar.com/something/new reescreve para rewrite.bar.com/new.
No contêiner nginx-ingress-controller, você pode exibir todas as configurações de entrada no arquivo nginx.conf no diretório /etc/nginx. A regra de reescrita no exemplo anterior gera um comando Rewrite e o grava no campo location no arquivo nginx.conf.
## start server rewrite.bar.com server { server_name rewrite.bar.com ; ... location ~* "^/something(/|$)(.*)" { set $namespace "default"; set $ingress_name "ingress-test"; set $service_name "<your_service_name>"; set $service_port "80"; ... rewrite "(?i)/something(/|$)(.*)" /$2 break; ... } } ## end server rewrite.bar.com
rewrite regex replacement [flag];
- regex: expressão regular para URIs correspondentes. No exemplo anterior, (?i)/something(/|$)(.*) é a expressão regular para URIs correspondentes, onde (?i) indica que não faz distinção entre maiúsculas e minúsculas.
- replacement: conteúdo a ser reescrito. No exemplo anterior, /$2 indica que o caminho é reescrito para todos os caracteres correspondentes pelo segundo parêntese (.*).
- flag: formato de reescrita.
- last: continua a corresponder à próxima regra depois que a regra atual é correspondida.
- break: pára a correspondência após a correspondência da regra atual.
- redirect: retorna um redirecionamento temporário com o código 302.
- permanent: retorna um redirecionamento permanente com o código 301.
Configuração de reescrita avançada
Alguns requisitos complexos e avançados de reescrita podem ser implementados modificando o arquivo de configuração do nginx.conf. No entanto, a função de anotação nginx.ingress.kubernetes.io/rewrite-target pode ser personalizada para atender a requisitos de reescrita mais complexos.
- nginx.ingress.kubernetes.io/server-snippet: adicione configurações personalizadas ao campo server no arquivo nginx.conf.
- nginx.ingress.kubernetes.io/configuration-snippet: adicione configurações personalizadas ao campo location no arquivo nginx.conf.
Você pode usar as duas anotações anteriores para inserir um comando Rewrite no campo server ou location no arquivo nginx.conf para reescrever o URL. O seguinte é um exemplo:
annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/configuration-snippet: | rewrite ^/stylesheets/(.*)$ /something/stylesheets/$1 redirect; # Add the /something prefix. rewrite ^/images/(.*)$ /something/images/$1 redirect; # Add the /something prefix.
- Quando um usuário acessa rewrite.bar.com/stylesheets/new.css, ele reescreve para rewrite.bar.com/something/stylesheets/new.css.
- Quando um usuário acessa rewrite.bar.com/images/new.jpg, ele reescreve para rewrite.bar.com/something/images/new.jpg.
Redirecionar HTTP para HTTPS
Por padrão, se um ingress usar TLS, as solicitações serão redirecionadas (código de status 308) para HTTPS quando o HTTP for usado para acesso. Você também pode usar a seguinte anotação para redirecionar solicitações forçadamente para HTTPS.
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-test namespace: default annotations: nginx.ingress.kubernetes.io/ssl-redirect: 'true' spec: rules: - host: '' http: paths: - path: / backend: service: name: <your_service_name> # Replace it with the name of your target Service. port: number: <your_service_port> # Replace 8080 with the port number of your target Service. property: ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH pathType: ImplementationSpecific ingressClassName: nginx
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: ingress-test namespace: default annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/ssl-redirect: 'true' spec: rules: - host: '' http: paths: - path: / backend: serviceName: <your_service_name> # Replace it with the name of your target Service. servicePort: <your_service_port> # Replace 8080 with the port number of your target Service.