.png)
Ich suche eine Lösung fürdieses Problem. Ich verstehe die Begründung, warum das Setup in dieser Frage nicht funktioniert, aber ich versuche, eine Lösung zu finden, mit der ich es zum Laufen bringen kann.
Die Idee ist, das Hochladen großer Dateien nur über bestimmte URLs zuzulassen. Ich kann location
dafür einen Block verwenden, aber das Problem ist: Ich habe ein PHP-Frontcontroller-Muster:
location ~ \.php {
# ...
fastcgi_pass unix:/tmp/php5-fpm.sock;
}
Meine Gesamtkonfiguration sieht folgendermaßen aus:
# ...
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;
}
}
}
So wie ich es verstehe, wird nur ein Standortblock angewendet. Wenn ich also eine Standardanforderungsgröße von 512 KB habe, werden die 256 MB nie 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 auf hochladen admin/upload
?
Antwort1
Wenn /admin/upload
der Pfad virtuell ist, kann er wie folgt zum Laufen gebracht werden:
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;
}
Auch nicht das Schönste, aber funktioniert.
Antwort2
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 das Schönste... Sollte aber funktional sein...
Antwort3
Die Verwendung mehrerer Standorte ist möglich, aber etwas schwierig.
Wenn Sie try_files
oder rewrite
wie oben erläutert verwenden, wird client_max_body_size
auf den des höheren Kontexts gesetzt client_max_body_size
und nicht wirklich auf den für den Standortblock, den Sie erwarten würden.
Verschieben Sie Ihre PHP FastCGI-Konfiguration in eine Datei, die Sie einbinden können, z. B. php-conf.conf
.
Verwenden Sie dann eine solche Konfiguration:
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;
}
Beachten Sie, dass Sie überschreiben müssen, SCRIPT_FILENAME
um zu verwenden index.php
, wenn Sie einen anderen Skriptnamen festgelegt haben. Dies kann aufgrund von passieren fastcgi_split_path_info ^(.+\.php)(/.*)$;
.