if ,-f and variables

Igor Sysoev is at rambler-co.ru
Wed Feb 27 22:34:10 MSK 2008


On Wed, Feb 27, 2008 at 12:34:08PM -0500, Sean Allen wrote:

> On Feb 27, 2008, at 11:42 AM, Roxis wrote:
> 
> >On Wednesday 27 February 2008, Sean Allen wrote:
> >>this works:
> >>
> >>if ( -f /ah/sites/colon365.co.uk/public/.maintenance )
> >>{
> >>  set $maintenance 1;
> >>}
> >>
> >>this doesn't:
> >>
> >>if ( -f $document_root/.maintenance )
> >>{
> >>  set $maintenance 1;
> >>}
> >>
> >>two questions,
> >>
> >>1. is there a way to make the latter work? some slight change or  
> >>tweak?
> >>2. why doesn't it work? are variables not interpolated when doing  
> >>file
> >>system checks like -f?
> >
> >it should work.
> >probably you have wrong root or root in wrong place.
> >plz provide full config
> >
> 
> One thing i just noticed. root is defined until after that snippet  
> above.
> is that an issue?
> 
> 
> Config is spread across multiple files.
> 
> Here is the best bits:
> 
> /ah/sites/colon365.co.uk/conf/nginx.conf:
> 
> server
> {
>   listen 208.113.69.210;
>   server_name colon365.co.uk;
>   server_name www.colon365.co.uk;
> 
>   include /ah/sites/colon365.co.uk/conf/nginx/base;
>   include /ah/sites/colon365.co.uk/conf/nginx/maintenance;
>   include /ah/sites/colon365.co.uk/conf/nginx/fake-homepage;
> 
>   access_log /var/log/ah/colon365.co.uk.log combined;
>   include /ah/conf/nginx/www-shared;
> }
> 
> 
> --
> 
> /ah/sites/colon365.co.uk/conf/nginx/base:
> 
> set $base /ah/sites/colon365.co.uk;
> 
> --
> 
> /ah/conf/nginx/www-shared:
> 
> include /ah/conf/nginx/root;
> include /ah/conf/nginx/favicon;
> include /ah/conf/nginx/standard-expire;
> include /ah/conf/nginx/unsub-aliases;
> include /ah/conf/nginx/hackersafe;
> include /ah/conf/nginx/historical;
> location /
> {
>   if ( !-e $request_filename )
>   {
>     expires -1;
>     proxy_pass http://mod_perl;
>     break;
>   }
> }
> 
> 
> --
> 
> /ah/conf/nginx/root:
> 
> set $root $base/public;
> root $root;

The "root" directive may be set in eny place of http, server, or locacation:
it will be properly set or inherited:

http {

    server {
       location / {
           # here root is /path
       }
   }

   root  /path;
}

But this is not true for "set" directives: they are executed in order
of thier apperance.

 include /ah/sites/colon365.co.uk/conf/nginx/base;
     set $base /ah/sites/colon365.co.uk;

 include /ah/sites/colon365.co.uk/conf/nginx/maintenance;

     using $document_root, here it is "root ''",
     because $root is still undefined

 include /ah/conf/nginx/www-shared;
   include /ah/conf/nginx/root;
     set $root $base/public;
     root $root;

You should to set "set $root $base/public;" early.


-- 
Igor Sysoev
http://sysoev.ru/en/





More information about the nginx mailing list