Nginx client_max_body_size per blocco di posizione (con pattern frontcontroller php)


8

Sto cercando una soluzione per questo problema . Comprendo il ragionamento per cui l'installazione in quella domanda non funziona, ma cerco di arrivare a una soluzione dove posso farlo funzionare.

L'idea è di consentire il caricamento di file di grandi dimensioni solo su determinati URL. Posso usare un locationblocco per questo, ma il problema è: ho un modello di frontcontroller php:

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

La mia configurazione totale è simile a:

# ...

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

A quanto ho capito, verrà applicato solo un blocco di posizione. Quindi, se ho una dimensione di richiesta predefinita di 512 KB, i 256 MB non verranno mai applicati poiché tutte le richieste vengono abbinate attraverso il modello del frontcontroller ~ \.php.

Ho ragione in questo caso e, in tal caso, cosa può essere configurato in modo tale che i visitatori non possano caricare nulla se non quando caricano admin/upload?

Risposte:


2

Definire due posizioni 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;
}

Forse non il più bello ... Dovrebbe essere funzionale però ..


1

Se il /admin/uploadpercorso è virtuale, è possibile farlo funzionare come segue:

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

Non anche il più bello, ma funziona.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.