Nginx client_max_body_size pro Standortblock (mit PHP-Frontcontroller-Muster)

8

Ich suche nach einer Lösung für dieses Problem . Ich verstehe die Gründe, warum das Setup in dieser Frage nicht funktioniert, aber ich versuche, eine Lösung zu finden, bei der ich es zum Laufen bringen kann.

Die Idee ist, das Hochladen großer Dateien nur für bestimmte URLs zuzulassen. Ich kann einen locationBlock dafür verwenden, aber das Problem ist: Ich habe ein PHP-Frontcontroller-Muster:

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

Meine Gesamtkonfiguration sieht aus wie:

# ...

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

Soweit ich weiß, wird nur ein Standortblock angewendet. Wenn ich also eine Standardanforderungsgröße von 512 KB habe, werden die 256 MB niemals angewendet, da alle Anforderungen über das Frontcontroller-Muster abgeglichen werden ~ \.php.

Habe ich in diesem Fall Recht und wenn ja, was kann so konfiguriert werden, dass Besucher nichts hochladen können, außer wenn sie hochladen admin/upload?

Jurian Sluiman
quelle

Antworten:

2

Zwei PHP-Standorte definieren?

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

Vielleicht nicht die schönste ... Sollte aber funktionieren ..

Daniel Widrick
quelle
1

Wenn der /admin/uploadPfad virtuell ist, kann er wie folgt funktionieren:

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

Nicht die schönste auch, aber funktioniert.

Yanot
quelle