Nginx client_max_body_size par bloc d'emplacement (avec motif php frontcontroller)

8

Je cherche une solution à ce problème . Je comprends le raisonnement pour lequel la configuration de cette question ne fonctionne pas, mais j'essaie de trouver une solution où je peux la faire fonctionner.

L'idée est de n'autoriser le téléchargement de fichiers volumineux que sur certaines URL. Je peux utiliser un locationbloc pour cela, mais le problème est: j'ai un modèle de contrôleur frontal php:

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

Ma configuration totale ressemble à:

# ...

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

Si je comprends bien, un seul bloc de localisation sera appliqué. Donc, si j'ai une taille de demande par défaut de 512 Ko, le 256 Mo ne sera jamais appliqué car toutes les demandes sont mises en correspondance via le modèle de contrôleur frontal ~ \.php.

Ai-je raison dans ce cas et si oui, qu'est-ce qui peut être configuré pour que les visiteurs ne puissent rien télécharger sauf quand ils le téléchargent admin/upload?

Jurian Sluiman
la source

Réponses:

2

Définir deux emplacements 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;
}

Peut-être pas le plus joli ... devrait être fonctionnel si ..

Daniel Widrick
la source
1

Si le /admin/uploadchemin est virtuel, il est possible de le faire fonctionner comme suit:

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

Pas le plus joli aussi, mais ça marche.

yanot
la source