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

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

Estoy buscando una solución paraeste problema. Entiendo el motivo por el cual la configuración en esa pregunta no funciona, pero trato de encontrar una solución donde pueda hacerla funcionar.

La idea es permitir la carga de archivos grandes sólo en determinadas URL. Puedo usar un locationbloque para esto, pero el problema es: tengo un patrón de controlador frontal de PHP:

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 bloqueo de ubicación. Entonces, si tengo un tamaño de solicitud predeterminado de 512K, los 256M nunca se aplicarán ya que todas las solicitudes coinciden a través del patrón frontcontroller ~ \.php.

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

Respuesta1

Si /admin/uploadla ruta 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;
}

Tampoco es el más bonito, pero funciona.

Respuesta2

¿Definir dos ubicaciones de 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...

Respuesta3

Es posible utilizar varias ubicaciones, pero es un poco complicado.

Si usa try_fileso rewritecomo se explicó anteriormente, entonces se client_max_body_sizeestablecerá en client_max_body_sizeel contexto superior, no en el del bloque de ubicación que esperaría.

Mueva su configuración PHP FastCGI a un archivo que pueda incluir, como php-conf.conf.

Luego use dicha configuración:

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

Tenga en cuenta que debe sobrescribir SCRIPT_FILENAMEpara usarlo index.phpsi tiene un nombre de script diferente configurado. Esto podría suceder debido a fastcgi_split_path_info ^(.+\.php)(/.*)$;.

información relacionada