Nginx client_max_body_size por bloque de ubicación (con patrón php frontcontroller)

8

Estoy buscando una solución para este problema . Entiendo el razonamiento por el cual la configuración en esa pregunta no funciona, pero trato de llegar a una solución donde pueda hacerlo funcionar.

La idea es permitir la carga de archivos grandes solo en ciertas URL. Puedo usar un locationbloque para esto, pero el problema es: tengo un patrón php frontcontroller:

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

Mi configuración total se ve así:

# ...

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

Según tengo entendido, solo se aplicará un bloque de ubicación. Entonces, si tengo un tamaño de solicitud predeterminado de 512K, el 256M nunca se aplicará ya que todas las solicitudes coinciden a través del patrón del controlador frontal ~ \.php.

Estoy en lo cierto en este caso y, de ser así, ¿qué se puede configurar para que los visitantes no puedan subir nada excepto cuando lo hacen admin/upload?

Jurian Sluiman
fuente

Respuestas:

2

Definir dos ubicaciones 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;
}

Quizás no sea el más bonito ... Aunque debería ser funcional ...

Daniel Widrick
fuente
1

Si la /admin/uploadruta es virtual, es posible hacer que funcione de la siguiente manera:

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

No es el más bonito también, pero funciona.

Yanot
fuente