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

7

Estou procurando uma solução para este problema . Eu entendo o raciocínio por que a configuração dessa pergunta não funciona, mas tento chegar a uma solução em que posso fazer com que ela funcione.

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

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 localização será aplicado. Portanto, se eu tiver um tamanho de solicitação padrão de 512K, o 256M nunca será aplicado, pois todas as solicitações são correspondidas por meio do padrão de frontcontroller ~ \.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 fizerem o upload para admin/upload ?

    
por Jurian Sluiman 05.12.2013 / 14:32

2 respostas

1

Defina 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 o mais bonito ... Deve ser funcional embora ...

    
por 13.08.2015 / 01:16
1

Se /admin/upload path for virtual, é possível fazer o seguinte:

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 é o mais bonito também, mas funciona.

    
por 06.11.2016 / 23:57

Tags