PUT リクエストに nginx リバースプロキシを使用するにはどうすればいいですか?

PUT リクエストに nginx リバースプロキシを使用するにはどうすればいいですか?

他の Web アプリケーションの前で nginx をリバース プロキシとして使用すると、PUTリクエストが転送されず、(アップストリーム サーバーではなく) nginx によって生成された HTTP 405 が表示されます。

http_405 の方法を試しましたproxy_next_upstreamが、うまくいきませんでした。 nginx 自体が、reverse_proxy が設定されている location ブロックに対して HTTP メソッドをチェックするのはなぜか疑問です。

答え1

ここで問題となるのは Nginx ではありません。リクエストが一致するPUT場合、期待どおりにリバース プロキシ ブロックでリクエストを転送します。location

別のディレクティブがありlocation、これは画像がリバース プロキシ経由で提供されないようにするものです。.png最終的にはすべてが一致し (他のファイル拡張子も一致)、アップロード URL も一致しました。

間違った場所ブロックの場合、エラー 405 が正しいです。解決策は、アップロード要求が実際にリバース プロキシに転送されることを確認することです。


動作するリバース プロキシ構成の例:

# 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;
}

優先される他の場所ブロックがない場合、構成は正常に機能します。
私の問題は別のブロックにありました:

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

関連情報