Nginx client_max_body_size por bloco de localização (com padrão php frontcontroller)

8

Estou procurando uma solução para este problema . Entendo o motivo pelo qual a configuração dessa pergunta não funciona, mas tento chegar a uma solução na qual possa fazê-la funcionar.

A ideia é permitir o upload de arquivos grandes apenas em determinados URLs. Eu posso usar um locationbloco para isso, mas o problema é: Eu tenho um padrão php frontcontroller:

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

Minha configuração total se parece com:

# ...

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

Pelo que entendi, apenas um bloco de local será aplicado. Portanto, se eu tiver um tamanho de solicitação padrão de 512K, os 256M nunca serão aplicados, pois todas as solicitações são correspondidas através do padrão do controlador frontal ~ \.php.

Estou certo neste caso e, em caso afirmativo, o que pode ser configurado para que os visitantes não possam fazer upload de nada, exceto quando fazem upload admin/upload?

Jurian Sluiman
fonte

Respostas:

2

Definir dois locais 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;
}

Talvez não seja a mais bonita ... Mas deve ser funcional ..

Daniel Widrick
fonte
1

Se o /admin/uploadcaminho for virtual, é possível fazê-lo funcionar da seguinte maneira:

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

Não é a mais bonita também, mas funciona.

Yanot
fonte