NGINXの「client_max_body_size」ディレクティブが「location」ブロック内で機能しない


13

私が持っている/admin私のウェブサイト上のカタログを、私は管理者がWebフォーム経由で大きなファイルをアップロードすることができるようにしたいと思います。nginx.comの外観は次のとおりです。

http {
    # ...
    client_max_body_size 16M;
    # ...

    server {
        server_name example.com;
        root /var/www/example.com;
        index index.php;

        location /admin {
            client_max_body_size 256M;
        }

        # ...
    }
}

これは動作しません。/admin/index.phpスクリプトは16Mbを超えるファイルをアップロードできません:413 Request Entity Too Large

ただし、ブロックするclient_max_body_sizeために移動すると、serverすべてが正常に機能します。しかし、私はこの変更をadminカタログだけにしたくありません。

docsによると、ブロックclient_max_body_size内に配置してlocation、目的のパスの設定のみをオーバーライドできます。

何が間違っているのでしょうか?

回答:


13

問題なく動作します。問題は、場所の仕組みを誤解していることです。Nginxは1つのロケーションブロックのみを適用し、複数のロケーションブロックは適用しません。したがって、2つの場所がある場合

location ~ \.php$そしてlocation /admin、URIは/admin/index.php最初の場所が適用されますが、2番目の場所は適用されません。ロケーション内でリライトを使用した場合でも、nginxはディレクティブを破棄し、新しいロケーション用に再解析します。

これは、実際に間違っていることを隠さないように、常に完全な構成を常に投稿する理由でもあります。


申し訳ありませんが、完全な設定を投稿していないため、あなたは正しいです。答えに関しては、これは真実ではありえません。docsの例を次に示します。wiki.nginx.org / HttpCoreModule# locationその他の場所では、複数のロケーションブロックがうまく機能します。
Temnovit

1
申し訳ありませんが、100%正しいです。Nginxは複数のロケーションブロックを検索できますが、1つのディレクティブのみを適用します。どちらを選択するかは、リンクしたページに記載されているルールによって異なります。
マーティンフィヨルドヴァルド

@MartinFjordvaldこれの解決策は何ですか?
カオスグル

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.