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