Este conteúdo foi traduzido por máquina para sua conveniência e a Huawei Cloud não pode garantir que o conteúdo foi traduzido com precisão. Para exibir o conteúdo original, use o link no canto superior direito para mudar para a página em inglês.
Central de ajuda/ Cloud Container Engine/ Guia de usuário/ Rede/ Ingresses/ Ingresses de Nginx/ Configuração de regras de reescrita de URL para ingresses de Nginx
Atualizado em 2024-11-28 GMT+08:00

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

Para clusters da v1.23 ou posterior:
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
Para clusters da v1.21 ou anterior:
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.

Por exemplo, a definição de ingress anterior resultará nas seguintes reescritas:
  • 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
A sintaxe básica do comando Rewrite é a seguinte:
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.
Nas duas regras anteriores, o caminho /something é adicionado ao URL de acesso.
  • 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.

Para clusters da v1.23 ou posterior:
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
Para clusters da v1.21 ou anterior:
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.