2

I use an nginx webserver and I've been trying to stop a problem where sites are given the wrong $_SERVER["PHP_SELF"] variable. This breaks some scripts. The problem seems to be that nginx is giving the wrong variables to FPM.

$_SERVER["PHP_SELF"] is "/index.php/index.php" and it should be "/index.php"

This is the nginx server PHP configuration...

server {
        listen 192.168.0.3:80;
        server_name cacti;
        access_log /home/admin/cacti_access_log;
        error_log /home/admin/cacti_error_log;
        root /var/www/sites/cacti;

        location / {
                index index.php index.html index.htm;
        }

        location ~* \.php$ {
                fastcgi_pass unix:/var/run/php-fpm/admin-socket;
                fastcgi_split_path_info ^(.+\.php)(/.*)$;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO $fastcgi_script_name;
                fastcgi_param  PATH_TRANSLATED    $document_root$fastcgi_path_info;

                include fastcgi_params;
                fastcgi_read_timeout 60;
        }
}

fastcgi_params...

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;
4
  • What is the complete configuration? Why are you including fastcgi_params and defining them separately in the block too? Sep 5, 2014 at 16:04
  • That is everything relevant to the problem. It is a bit of a mess because I've been trying a few different things. The result is the same without the include, because at this point it doesn't add anything. So between it and the include there is a lot of redundancy.
    – John Tate
    Sep 5, 2014 at 16:14
  • Have you tried the default configuration with include fastcgi_params? What CMS do you use, and what kind of routing system it uses? Have you defined any rewrites for the CMS in nginx? These are all very much relevant points in diagnosing the problem. Sep 5, 2014 at 16:17
  • I've updated and included the entire server config. It's just for cacti, and there are no rewrites as you can see. I'm not sure what you mean by routing system.
    – John Tate
    Sep 5, 2014 at 16:20

1 Answer 1

4

First, move include fastcgi_params before the fastcgi_param entries. nginx processes these directives in order, so configuration inside fastcgi_params file will override your definition in the server block.

Then, use thse settings for PATH_INFO and PATH_TRANSLATED:

fastcgi_param  PATH_INFO          $fastcgi_path_info;
fastcgi_param  PATH_TRANSLATED    $document_root$fastcgi_script_name;
2
  • Okay, I've done all that but $_SERVER["PHP_SELF"] is still /index.php/index.php - and PATH_TRANSLATED was already set the way you just mentioned.
    – John Tate
    Sep 5, 2014 at 17:13
  • I think you meant for PATH_TRANSLATED to be $document_root$fastcgi_script_name because now it seems to work!
    – John Tate
    Sep 5, 2014 at 17:15

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .