nginx – php value / ini_set for specific url

Scenario – php.ini sets upload_max_filesize to 25MBs but on some upload urls you need higher value.

This can’t be done through ini_set() function – you can change max_execution_time, memory limits, but not upload limits through this function. If you are using nginx, you can’t rely on .htaccess either.

Luckily, there’s a way. Following real case scenario is for Laravel CMS, PHP-FPM 7.4, Nginx.

location ~ \.php$ {
    include snippets/fastcgi-php.conf;

    set $phpval "upload_max_filesize = 25M \n post_max_size=25M";

    if ($request_uri ~ ^/video/upload(.*)$) {
    	set $phpval "post_max_size=1536M \n upload_max_filesize=1536M";
    }


    fastcgi_param PHP_VALUE $phpval;
    fastcgi_pass unix:/run/php/php7.4-fpm.sock; 
}

What happens here is that we create a variable called $phpval and set default values – the same as in php.ini. Then we check if ‘/video/upload’ is in the url – if it is, change the value of variable $phpval. Before passing request to php socket, we set the PHP_VALUE.

Couple notes to keep in mind

  • fastcgi_param can not be set inside the if() {} block. Hence the additional variable
  • there must be only one fastcgi_param per location block
  • you can’t use variables to set nginx parameters such as clinet_max_body_size
  • separate php settings by \n
  • use PHP_ADMIN_VALUE instead of PHP_VALUE if you want to make sure the value won’t be overwritten by ini_set ( e.g. maximum execution time )

Write a Comment

Comment