Nginx client_max_body_size per location block (with php frontcontroller pattern)
If /admin/upload
path is virtual, it is possible to make it work as follows:
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;
}
Not the prettiest too, but works.
Define two php locations?
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;
}
Perhaps not the prettiest... Should be functional though..
Using multiple locations is possible, but is a bit tricky.
If you use try_files
or rewrite
as explained above, then the client_max_body_size
would be set to the client_max_body_size
of the higher context, not really the one for the location block you'd expect it to.
Move your PHP FastCGI configuration into a file that you can include, such as php-conf.conf
.
Then use such a configuration:
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;
}
Note that you need to overwrite SCRIPT_FILENAME
to use index.php
if you have a different script name set. This could happen because of fastcgi_split_path_info ^(.+\.php)(/.*)$;
.