What's fastcgi_param scope

Maxim Dounin mdounin at mdounin.ru
Thu Mar 24 12:24:16 MSK 2011


Hello!

On Wed, Mar 23, 2011 at 04:34:38PM -0700, Jakub Zalas wrote:

> Hi,
> 
> I'm experiencing odd behavior of fastcgi_param.
> 
> Based on the URL I'd like to pass additional parameters to PHP.
> 
> For example:
> 
> location ~ "^/foo/bar$" {

Just a side note: use "location = /foo/bar" instead.

>   # this is not passed to fastcgi and not acesible via $_SERVER
>   fastcgi_param _ROUTING__route foo;
>   fastcgi_index app.php;

Just a side note: fastcgi_index doesn't make sense here at all.

>   rewrite ^(.*) /app.php last;
> }

As soon as you did internal redirect (with rewrite) - 
configuration in this location no longer applies.  Instead 
configuration in destination location will be used.

> # standard PHP stuff
> location ~ \.php {
>     set  $script     $uri;
>     set  $path_info  "";
>     if ($uri ~ "^(.+\.php)(/.*)") {
>       set  $script     $1;
>       set  $path_info  $2;
>     }
>     fastcgi_pass   127.0.0.1:9000;
>     include /etc/nginx/fastcgi_params;
>     fastcgi_param  SCRIPT_FILENAME  /var/www/$host/web$script;
>     fastcgi_param  PATH_INFO        $path_info;
>     fastcgi_param  SCRIPT_NAME $script;
> }

... and this one has no "fastcgi_param _ROUTING__route" set.

> I also tried nesting location but the result is the same.
> fastcgi_param defined in nested location block is not passed to PHP.
> 
> Could anyone explain me why it works this way?

See above.  Solution is to write explicitly what you want to 
happen instead of using internal redirects, i.e. something like 
this:

    location = /foo/bar {
        fastcgi_pass 127.0.0.1:9000;
        include /etc/nginx/fastcgi_params;
        fastcgi_param SCRIPT_FILENAME /var/www/$host/web/app.php;
        fastcgi_param _ROUTING__route foo;
        ...
    }

Maxim Dounin

p.s. The only thing which survives internal redirect is variables.  
Theoretically you may rewrite your config to set some variables 
before rewrite and then use appropriate fastcgi_param in .php 
location.  But it's not going to scale well and not recommended.



More information about the nginx mailing list