Nginx ロケーション ブロックごとの client_max_body_size (php frontcontroller パターンを使用)

Nginx ロケーション ブロックごとの client_max_body_size (php frontcontroller パターンを使用)

私は解決策を探していますこの問題その質問の設定が機能しない理由は理解していますが、機能するように解決策を見つけようとしています。

アイデアは、特定の URL でのみ大きなファイルのアップロードを許可することです。locationこれにはブロックを使用できますが、問題は次のとおりです。PHP フロント コントローラー パターンがあります。

location ~ \.php {
    # ...
    fastcgi_pass unix:/tmp/php5-fpm.sock;
}

私の全体の構成は次のようになります:

# ...

http {
    # ...

    client_max_body_size 512K;

    server {
        server_name example.com;
        root        /var/www/example.com/public;

        location / { 
            try_files $uri /index.php?$query_string;
        }

        location /admin/upload {
            client_max_body_size 256M;
        }

        location ~ \.php {
            # ...

            fastcgi_pass unix:/tmp/php5-fpm.sock;
        }
    }
}

私の理解では、適用されるロケーション ブロックは 1 つだけです。したがって、デフォルトのリクエスト サイズが 512K の場合、すべてのリクエストはフロント コントローラ パターンを通じて照合されるため、256M は適用されません~ \.php

この場合、私の考えは正しいでしょうか。もし正しいとすれば、訪問者が にアップロードする場合以外は何もアップロードできないようにするには、何を設定すればよいでしょうかadmin/upload

答え1

パスが仮想の場合/admin/upload、次のように動作させることができます。

location / {
    try_files $uri /index.php?$args;
}

location /admin/upload {
    client_max_body_size 256M;

    include inc/php.conf;
    rewrite ^(.*)$ /index.php?$args break;
}

location ~ \.php$ {
    include inc/php.conf;
}

あまりきれいではありませんが、機能します。

答え2

2 つの PHP の場所を定義しますか?

location ~ ^/admin/upload/.+\.php$
{
    client_max_body_size 256M;
    include /etc/nginx/conf.d/php-fpm.conf;
}   
location ~ \.php
{
    include /etc/nginx/conf.d/php-fpm.conf;
}

あまりきれいではないかもしれませんが... 機能的には問題ないはずです...

答え3

複数の場所を使用することは可能ですが、少し複雑です。

上で説明したようにtry_filesまたは を使用すると、 は、期待される場所ブロックの ではなく、より高いコンテキストのに設定されます。rewriteclient_max_body_sizeclient_max_body_size

PHP FastCGI 構成を、 などのインクルード可能なファイルに移動しますphp-conf.conf

次に、次のような構成を使用します。

    location / {
        # try to serve file directly, fallback to index.php
        try_files $uri /index.php$query_string;
    }

    location ~ ^/admin/upload$ {
        client_max_body_size 4m;
        include /etc/nginx/php-conf.conf;
        fastcgi_param SCRIPT_FILENAME $realpath_root/index.php;
    }

    location ~ ^/index\.php(/|$) {
        include /etc/nginx/php-conf.conf;
        internal;
    }

SCRIPT_FILENAME異なるスクリプト名が設定されている場合は、使用するために上書きする必要があることに注意してくださいindex.php。これは、 が原因で発生する可能性がありますfastcgi_split_path_info ^(.+\.php)(/.*)$;

関連情報