Nginx client_max_body_size per blok lokasi (dengan pola frontcontroller php)

8

Saya mencari solusi untuk masalah ini . Saya mengerti alasan mengapa pengaturan dalam pertanyaan itu tidak berhasil, tetapi saya mencoba untuk mendapatkan solusi di mana saya bisa membuatnya bekerja.

Idenya adalah untuk memungkinkan unggahan file besar hanya pada url tertentu. Saya dapat menggunakan locationblok untuk ini, tetapi masalahnya adalah: Saya memiliki pola frontcontroller php:

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

Konfigurasi total saya terlihat seperti:

# ...

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

Seperti yang saya mengerti, hanya satu blok lokasi yang akan diterapkan. Jadi jika saya memiliki ukuran permintaan standar 512K, 256M tidak akan pernah diterapkan karena semua permintaan dicocokkan melalui pola frontcontroller ~ \.php.

Apakah saya benar dalam kasus ini dan jika demikian, apa yang dapat dikonfigurasi sehingga pengunjung tidak dapat mengunggah apa pun kecuali ketika mereka mengunggah admin/upload?

Jurian Sluiman
sumber

Jawaban:

2

Tentukan dua lokasi 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;
}

Mungkin bukan yang tercantik ... Harus fungsional ..

Daniel Widrick
sumber
1

Jika /admin/uploadpath virtual, dimungkinkan untuk membuatnya bekerja sebagai berikut:

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

Bukan yang tercantik juga, tapi berhasil.

yanot
sumber