Estou tentando executar vários contêineres do docker, todos executando o nginx escutando na porta 80, mas com diferentes portas de host mapeadas para a porta 80 dos contêineres.
Na maioria das vezes, isso funciona, exceto quando o nginx faz um redirecionamento devido à falta de uma barra final.
server {
listen 80;
root /var/www;
index index.html;
location /docs {}
}
Dada a configuração do nginx acima e um contêiner do docker executando-o com a porta 8080 do host mapeada para a porta 80 do contêiner, posso obter localhost: 8080 / docs / via curl ok:
> GET /docs/ HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 200 OK
* Server nginx/1.9.5 is not blacklisted
< Server: nginx/1.9.5
< Date: Sat, 28 Nov 2015 17:27:05 GMT
< Content-Type: text/html
< Content-Length: 6431
< Last-Modified: Sat, 28 Nov 2015 17:17:06 GMT
< Connection: keep-alive
< ETag: "5659e192-191f"
< Accept-Ranges: bytes
<
... html page ...
mas se eu solicitar localhost: 8080 / docs, recebo um redirecionamento para localhost / docs /
> GET /docs HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
* Server nginx/1.9.5 is not blacklisted
< Server: nginx/1.9.5
< Date: Sat, 28 Nov 2015 17:29:40 GMT
< Content-Type: text/html
< Content-Length: 184
< Location: http://localhost/docs/
< Connection: keep-alive
<
... html redirect page ...
Como posso obter o nginx para preservar a porta original ao fazer o redirecionamento? Eu tentei olhar para port_in_redirect e server_name_in_redirect, mas eles não ajudaram.
EDITAR
Com base em https://forum.nginx.org/read.php?2,261216,261216#msg-261216, isso não parece possível no momento.
Respostas:
A solução mais simples é remover a
index
diretiva e não confiar em$uri/
redirecionamentos explícitos ou implícitos . Por exemplo:Esse comportamento não é idêntico, pois evita completamente o redirecionamento. Se você deseja um redirecionamento de barra final, como o módulo de índice fornece, é necessária uma solução mais complexa. Por exemplo:
fonte
Os clientes HTTP colocarão a porta no cabeçalho do host. Se você usar o valor original do cabeçalho do host ao fazer o redirecionamento, ele deverá funcionar conforme o esperado. Testei o código a seguir e parece estar fazendo exatamente o que você solicitou:
fonte
Basta seguir esta correção simples
fonte
Interessante ... Encontrei exatamente esse problema e pude corrigi-lo da mesma forma que a resposta de Richard Smith sugere:
A única diferença é que eu não especifico
index.html
?Especifique o código de erro para evitar um loop de redirecionamento.
Ainda estou aguardando feedback do suporte do nginx.
fonte