Configure um redirecionamento padrão no Nginx

Configure um redirecionamento padrão no Nginx

Preciso de uma maneira de redirecionar clientes quando nenhum caminho existente estiver definido. Quando coloco uma configuração de retorno 301, o nginx parece ignorar qualquer configuração de local. Ele redireciona tudo.

O nome do host no redirecionamento precisa ser dinâmico (vindo do cliente). Esses servidores são, na verdade, contêineres e são implantados em ambientes Dev/Prod. Portanto, o URL do cliente muda de algo como dev.example.com para example.com. Prefiro não trocar configurações com base em ambientes.

Estou usando a v1.18 no RHEL. Os servidores com proxy são aplicativos Angular gerenciados por seus respectivos desenvolvedores.

server {
  listen 80;
  server_name _;

  index index.html;

  location = /service/a {
    proxy_pass http://svc-a.local/service/a/;
  }
  location /service/a/ {
    proxy_pass http://svc-a.local/service/a/;
  }

  location = /service/b {
    proxy_pass http://svc-b.local/service/b/;
  }
  location /service/b/ {
    proxy_pass http://svc-b.local/service/b/;
  }

  location = /service/x {
    proxy_pass http://svc-x.local/service/x/;
  }
  location /service/x/ {
    proxy_pass http://svc-x.local/service/x/;
  }

  location = /home {
    proxy_pass http://home.local/home/;
  }
  location /home/ {
    proxy_pass http://home.local/home/;
  }

  # kubernetes probes this, but fails getting 301
  location /nginx_status {
    stub_status on;
    acccess_log off;
  }

  # IF NO MATCH FROM ABOVE THEN GO TO /HOME

  # try #1
  return 301 http://$host/home/;

  # try #2
  location = / {
    return 301 http://$host/home/;
  }

  # try #3
  return 301 /home/;

  # try #4
  location = / {
    proxy_pass http://home.local/home/;
  }
}

Responder1

A return 301regra, quando estiver fora de qualquer bloco de localização, será aplicada a todo o bloco do servidor e terá precedência sobre os blocos de localização. Em vez disso, você pode definir um bloco de localização padrão/substituto, como na tentativa nº 2, mas sem o sinal de igual ( =). O sinal de igual especifica uma correspondência exata e, em vez disso, você deseja uma correspondência de prefixo para que corresponda a todas as solicitações.

Por exemplo:

server {
  listen 80;
  server_name _;

  index index.html;

  location = /service/a {
    proxy_pass http://svc-a.local/service/a/;
  }
  location /service/a/ {
    proxy_pass http://svc-a.local/service/a/;
  }

  location /service/b/ {
    proxy_pass http://svc-b.local/service/b/;
  }

  location = /service/x {
    proxy_pass http://svc-x.local/service/x/;
  }
  location /service/x/ {
    proxy_pass http://svc-x.local/service/x/;
  }

  location = /home {
    proxy_pass http://home.local/home/;
  }
  location /home/ {
    proxy_pass http://home.local/home/;
  }

  # kubernetes probes this, but fails getting 301
  location /nginx_status {
    stub_status on;
    acccess_log off;
  }

  # IF NO MATCH FROM ABOVE THEN GO TO /HOME

  location / {
     return 301 http://$host/home/;
  }
}

informação relacionada