Como usar o nginx reverse_proxy para solicitações PUT?

Como usar o nginx reverse_proxy para solicitações PUT?

Quando uso o nginx como proxy reverso na frente de algum outro aplicativo da web, ele parece não encaminhar PUTsolicitações, mas mostra um HTTP 405 gerado pelo nginx (e não pelo servidor upstream).

Tentei o proxy_next_upstreammétodo para http_405, mas não funcionou. Eu me pergunto por que o próprio nginx verifica o método HTTP em busca de um bloco de localização que possui um reverse_proxy configurado.

Responder1

Nginx não é o problema aqui. Ele encaminha PUTsolicitações em blocos de proxy reverso conforme esperado, se locationcorresponderem à solicitação.

Eu tinha outra locationdiretiva, que garante que as imagens não sejam veiculadas por meio do proxy reverso. No final, ele combinou com tudo .png(e algumas outras extensões de arquivo), o que também correspondeu aos URLs de upload.

Para o bloco de localização errado, o erro 405 está correto. A solução é garantir que as solicitações de upload sejam realmente encaminhadas para o proxy reverso.


Um exemplo de configuração funcional de proxy reverso:

# proxy requests for /upload the a webapp, which implements PUT
location ^~ /upload {
    proxy_pass "https://backendserver:1234/something";
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_buffering off;
    tcp_nodelay on;
}

A configuração funciona bem, se não houver outros blocos de localização que tenham precedência.
Meu problema foi outro bloqueio:

# This block matched requests for /upload/somefile.png before the proxy block
location ~* ^(/.*png|/.*jpg|/.*jpeg|/.*gif)$ {
    # some directives without proxy_pass
}

informação relacionada