Eu acho que você tem error_page 404 definido para algum lugar no segundo local
Estou testando uma configuração em que gostaria de ter o nginx apresentando mídia estática e fazer proxy de todas as outras solicitações para outro back-end. Minha configuração é assim:
location /media {alias /var/httpd/media;}
location / {proxy_pass http://127.0.0.1:8080;}
No entanto, se uma solicitação for feita para um recurso de mídia não existente, por exemplo, /media/foo.js
, nginx tenta procurar por /var/httpd/media/foo.js
e, quando não encontrado, também tenta fazer proxy da solicitação para 127.0.0.1:8080
. Aqui estão os registros de erro do nginx:
2012/05/18 17:09:21 [error] 10073#0: *1 open() "/var/httpd/media/foo.js" failed (2: No such file or directory), client: 127.0.0.1, server: www.example.com, request: "GET /media/foo.js HTTP/1.1", host: "www.example.com"
2012/05/18 17:09:21 [error] 10073#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 127.0.0.1, server: www.example.com, request: "GET /media/foo.js HTTP/1.1", upstream: "http://127.0.0.1:8080/media/foo.js", host: "www.example.com"
Além disso, percebo que, se existir /var/httpd/media/foo.js
, mas não for legível pelo processo que está executando nginx, o nginx não tentará usar proxy para http://127.0.0.1:8080
e retornará 403 Forbidden
. Registo de erros:
2012/05/18 17:09:33 [error] 10073#0: *1 open() "/var/httpd/media/foo.js" failed (13: Permission denied), client: 127.0.0.1, server: www.example.com, request: "GET /media/foo.js HTTP/1.1", host: "www.example.com"
Por que o primeiro cenário faz com que ambos os blocos de localização sejam processados e o segundo cenário apenas faça com que o bloco de localização de mídia seja processado? Como posso fazer o primeiro cenário processar apenas o bloco de localização de mídia e não tentar fazer proxy para o back-end?
Observação: eu também tentei adicionar um prefixo ^~
ao bloco de localização de mídia:
location ^~ /media {alias /var/httpd/media;}
... mas isso não alterou o comportamento do nginx, pois continuou a cair no bloco /
após falhar no bloco /media
.