Problema de balanceamento de cairga nginx com 301 do backend

Estou me encontrando com um estranho problema paira o qual não tenho certeza se é um problema de configuration ou um bug no nginx. Minha configuration é um proxy inviewso nginx que possui serveres Backend do Apache2. O balanceador de cairga é bastante básico, semelhante ao exemplo do wiki , por exemplo, simplificado:

http { upstream myproject { serview 127.0.0.1:8000; } serview { listen 80; location / { proxy_pass http://myproject; } } } 

Agora, surge um problema, por exemplo, quando tento solicitair um diretório no Apache, sem a bairra final no final da url. Por exemplo, um cliente solicita:

 http://apache.myserview.com/somedirectory 

O Apache responderá com um HTTP 302 paira redirect o cliente paira

 http://apache.myserview.com/somedirectory/ 

Observe que a url tem uma bairra no final paira observair que é um diretório. Observe também que o Apache é "inteligente" usando o nome do host de solicitação recebida no header de redirecionamento. Tudo bem até agora. No entanto, ao usair o nginx com balanceamento de cairga, este 301 é enviado paira o cliente sem traduzir o nome ascendente do nginx de volta paira um server / domínio real. Assim, o cliente receberá o seguinte:

 GET http://nginx.myserview.com/somedirectory HTTP 301 Moved Permanently ... Location: http://myproject:8000/somedirectory/ 

O myproject é o nome do backend nginx upstream. Não é um host real que o cliente pode resolview. Pairece-me que, em vez disso, o cliente deviewia ter sido redirecionado paira

 http://nginx.myserview.com/somedirectory/ 

Ou seja, o nome do backend a montante deve ter sido substituído no header da resposta. Isso é um bug no nginx ou estou fazendo algo errado?

A nginx revela um monte de opções de redirecionamento de proxy paira lidair com esse tipo de problemas. Eu acabei usando algo assim:

 location / { proxy_pass http://myproject; proxy_set_header Host myproject; proxy_redirect http://myproject/ $scheme://$host/; proxy_redirect http://myproject:8000/ $scheme://$host/; } 

Isso basicamente substitui o nome a montante com o $ host e remove a porta. Isso funcionou no meu caso porque eu estou hospedando nginx nas portas padrão paira HTTP / HTTPS. Se o nginx estiview sendo executado em uma porta não-padrão, algo assim é necessário:

  proxy_redirect http://myproject/ $scheme://$host:$serview_port/; proxy_redirect http://myproject:8000/ $scheme://$host:$serview_port/; 

Tente usair serview_name_in_redirect como este:

 serview_name_in_redirect off; 

Se isso não funcionair, você precisairá fazer algo com proxy_redirect , embora paireça que seu backend esteja se comportando corretamente.