Redirecionamento de local indesejado nginx com barra final

Redirecionamento de local indesejado nginx com barra final

Eu tenho um local

location /pass/ {
    proxy_pass http://localhost:12345/;
}

Portanto, é suposto fazer proxy de URLs http://example.com/pass/whateverparahttp://localhost:12345/whatever

O que não gosto é que o nginx adiciona automaticamente uma barra

http://example.com/pass

e faz isso http://example.com/pass/via redirecionamento 301

Como posso simplesmente evitar esse comportamento. Quero, /passsem barra final, ir para outro local. Desde já, obrigado!

Responder1

Há um caso especial em que a proxy_passcom locationterminação em /resultaria em um 301redirecionamento implícito automático sem ir para o back-end; você precisa criar um explícito locationsem a barra final para evitar isso:

Se um local for definido por uma sequência de prefixo que termina com o caractere de barra e as solicitações forem processadas por proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass ou grpc_pass, o processamento especial será executado. Em resposta a uma solicitação com URI igual a esta string, mas sem a barra final, um redirecionamento permanente com o código 301 será retornado ao URI solicitado com a barra anexada. Se isso não for desejado, uma correspondência exata do URI e do local poderá ser definida assim:

location /user/ {
    proxy_pass http://user.example.com;
}

location = /user {
    proxy_pass http://login.example.com;
}

Por exemplo, você precisa criar um explícito /pass locationalém do existente /pass/, caso contrário, um implícito location /pass {return 301 /pass/…;}será criado para você.

No entanto, você tem certeza de que realmente deseja fazer o que está tentando fazer? Se você omitir um redirecionamento de /passpara /pass/, os caminhos relativos não funcionarão. Alguns navegadores mais recentes também tendem a apresentar UI/UX defeituosos que podem não apresentar a barra final para o usuário, o que pode tornar as coisas ainda mais confusas ao tentar solucionar o problema da distinção.

Responder2

Como você quer que vá paraoutro local, uma solução natural é adicionar esse local

location /pass {
}

Por padrão, o nginx procurará um arquivo chamado ‘pass’ na raiz da web. Se você não gostar deste padrão, poderá adicionar mais diretivas dentro deste novo bloco de localização para conseguir isso.

Você também pode usar

location = /pass {
}

de modo que o nginx possa encontrar a correspondência um pouco mais rápido.

informação relacionada