Eu estou correndo em um problema estranho para o qual eu não tenho certeza se é um problema de configuração ou um bug no nginx. Minha configuração é um proxy reverso nginx que possui servidores backend Apache2. O balanceador de carga é bastante básico, semelhante ao exemplo do wiki , por exemplo simplificado:
http {
upstream myproject {
server 127.0.0.1:8000;
}
server {
listen 80;
location / {
proxy_pass http://myproject;
}
}
}
Agora, surge um problema, por exemplo, quando tento solicitar um diretório no Apache, sem a barra final no final do URL. Por exemplo, um cliente solicita:
http://apache.myserver.com/somedirectory
O Apache responderá com um HTTP 302 para redirecionar o cliente para
http://apache.myserver.com/somedirectory/
Observe que o URL tem uma barra no final para observar que é um diretório. Observe também que o Apache é "inteligente" usando o nome de host do pedido recebido no cabeçalho de redirecionamento. Tudo bem até agora. No entanto, ao usar nginx com balanceamento de carga, este 301 é enviado para o cliente sem converter o nome upstream nginx em um servidor / domínio real. Então o cliente receberá o seguinte:
GET http://nginx.myserver.com/somedirectory
HTTP 301 Moved Permanently
...
Location: http://myproject:8000/somedirectory/
O myproject
é o nome do backend upstream do nginx. Não é um host real que o cliente possa resolver. Parece-me que, em vez disso, o cliente deveria ter sido redirecionado para
http://nginx.myserver.com/somedirectory/
Ou seja. o nome do back-end upstream deveria ter sido substituído no cabeçalho de resposta. Isso é um bug no nginx ou estou fazendo algo errado?