Home » Php » fastcgi – Nginx + phpFPM: PATH_INFO always empty

fastcgi – Nginx + phpFPM: PATH_INFO always empty

Posted by: admin July 12, 2020 Leave a comment


I configured nginx stable (1.4.4) + PHP (using FastCGI, php-fpm) on Debian. That works fine:

     location ~* ^/~(.+?)(/.*\.php)$ {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        alias /home/$1/public_html$2;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        fastcgi_index index.php;
        autoindex on;

I use the PATH_INFO variable, therefore I added the following line to fastcgi_params:

fastcgi_param   PATH_INFO       $fastcgi_path_info;

And in /etc/php5/fpm/php.ini:

cgi.fix_pathinfo = 0

I think that should work, but when I print out all server variables, PATH_INFO is always empty:

    array (
  'USER' => 'www-data',
  'HOME' => '/var/www',
  'QUERY_STRING' => '',
  'CONTENT_TYPE' => '',
  'SCRIPT_FILENAME' => '/usr/share/nginx/html/srv_var.php',
  'SCRIPT_NAME' => '/srv_var.php',
  'PATH_INFO' => '',
  'REQUEST_URI' => '/srv_var.php',
  'DOCUMENT_URI' => '/srv_var.php',
  'DOCUMENT_ROOT' => '/usr/share/nginx/html',
  'SERVER_SOFTWARE' => 'nginx/1.4.4',

I can not figure where the problem is. Any ideas?

How to&Answers:

I stumbled across a solution to this. The $fastcgi_path_info var works together with $fastcgi_split_path_info, and needs to be set within the location block. Here’s what worked in our environment:

location ~ [^/]\.php(/|$) {
    root /var/www/jurism-php;
    if (!-f $document_root$fastcgi_script_name) {
        return 404;
    # Mitigate https://httpoxy.org/ vulnerabilities
    fastcgi_param HTTP_PROXY "";
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    include fastcgi_params;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;

There is also an example in the Nginx documentation under fastcgi_split_path_info.

(… which I now see matches more than one post above. Possibly the PATH_INFO line needs to be set after the include statement, to avoid clobbering the value.)


My working configuration is as follows:

location ~ [^/]\.php(/|$) {
    fastcgi_split_path_info ^(.+\.php)($|/.*);
    try_files $fastcgi_script_name =404;

    set $path_info $fastcgi_path_info;
    fastcgi_param PATH_INFO $path_info;

    fastcgi_index  index.php;  
    include fastcgi_params;    
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_ignore_client_abort off;


Try this:

set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;




Late answer but it might be useful to someone.

I used the variable REQUEST_URI instead of PATH_INFO. Looks like it contains the same value as PATH_INFO is supposed to have.


here is what i got. and it works like a charm.

  • nginx 1.10.1
  • php 5.6.24