rewritecond for nginx

Chris Cortese cortese.consulting at gmail.com
Fri Feb 27 16:06:28 MSK 2009


Thanks Igor.  I moved towards the "location" style you described.  I got 
rid of a lot of extra stuff and I moved all but one vhost (conf.d file) 
out of the conf.d directory.

Somehow I broke stylesheets and images.

Also, my cgi stuff is still going to index.php.

This is codeigniter framework, so urls that have /controller/model 
should get passed to index.php.  So, http://mysite.com/search/metro 
should become http://mysite.com/index.php?q=search/metro.  This part is 
happening.  However, I don't want the rewrite to happen for /images, 
/javascript, /style, /tmp, /filestore, etc.  Then also I want the 
/cgi-bin to be handled by fcgiwrap.  Right now if I go to 
http://mysite.com/cgi-bin/test.pl, it is still getting sent to index.php.

This is my config file (domain name here changed to "mysite.com"):

server {
  listen   81;
  server_name  dev.mysite.com;

  root /home/my_linux_user/www/dev/mysite/trunk/html/public;
  index index.php;

  access_log  /var/log/nginx/dev_mysite.access.log;
  error_log /var/log/nginx/dev_mysite.error.log;

  if ($request_filename ~ javascript) {
    rewrite ^/javascript/(.*)$ /combine.php?type=javascript&files=$1 last;
  }

  location /tmp/ {
    rewrite ~/(.*)$ /$1 last;
  }

  location /filestore/ {
    rewrite ~/(.*)$ /$1 last;
  }

  location /cgi-bin/ {
    fastcgi_pass unix:/tmp/cgi.sock;
    include /etc/nginx/perl_fcgiwrap_params;
  }

  if (!-e $request_filename) {
    rewrite ^/(.*)$ /index.php?q=$1 last;
  }

  location ~* (jpg|jpeg|gif|png|js|css) {
      expires    30d;
      access_log off;
  }

  location ~ /index.php {
    fastcgi_pass  127.0.0.1:10005;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME 
/home/my_linux_user/www/dev/mysite/trunk/html/public$fastcgi_script_name;
    include /etc/nginx/fastcgi_params;
  }
}




Igor Sysoev wrote:
> On Fri, Feb 27, 2009 at 03:44:51AM -0800, Chris Cortese wrote:
>
>   
>> I think I figured out the answer to my last question about perl CGI.  I 
>> put the path to cgi-bin in the fastcgi_params file.
>>
>> I have another question:
>>
>> How can I tell nginx to not rewrite certain directories?  I use the 
>> RewriteCond in Apache.  I googled for the answer and I read that I 
>> should use "if" conditions.  But I'm still not totally clear.  I'm using 
>> rewrite on most of my php code with:
>>
>>
>>    if (!-e $request_filename) {
>>      rewrite ^/(.*)$ /index.php?q=$1 last;
>>    }
>>
>> ...and that works fine..   now I just want to say:  Don't do any rewrite 
>> for directories named /tmp, /filestore, and /cgi-bin.
>>
>> I tried the following, thinking that the rewrite rule would accomplish 
>> nothing other than telling nginx not to use any subsequent rewrite 
>> rules.  It looks crazy but it's all I could come up with:
>>
>> if ($request_filename ~ (tmp|filestore|cgi-bin)) {
>>    rewrite ~/(.*)$ /$1 last;
>>  }
>>
>> I put those 3 lines before the other 3 lines up above.
>>
>> What should I have instead?
>>     
>
> You should forget to think in inverted RewriteCond/RewriteRule terms
> and start to think in human natural locations:
>
>      location / {
>          ...
>          error_page  404  = /index.php?q=$request_uri;
>      }
>
>      location /filestore/ {
>          ...
>      }
>
>      location /tmp/ {
>          ...
>      }
>
>      location /cgi-bin/ {
>          ...
>      }
>
>
>   






More information about the nginx mailing list