nginx bug

Maxim Dounin mdounin at mdounin.ru
Tue Apr 21 03:04:05 MSD 2009


Hello!

On Mon, Apr 20, 2009 at 11:19:55PM +0200, Victor Iggy wrote:

> Ok, there has to be a bug here some where. My $request_uri isn't
> matching.
> 
> I have also ran if ($request_uri !~ "^/resources/.*") {} just to see if
> my regexp is messed up. The line isn't being evaluated.
> I am pretty sure it is reaching the proxy_pass since I can add
> "add_header X-Foo 'bar';" and that will be appended to response.
> 
> nginx 0.7.52
> 
> location / {
>             if ($request_uri ~ "^/resources/.*") {
>                 add_header X-Foo 'bar';
>                 expires 30d;
>             }
> 
>             if (!-f $request_filename) {
>                 proxy_pass http://127.0.0.1:8089;
>                 break;
>             }
> }

I'm not really sure that I understand what you are trying to say, 
but it looks like there is some misunderstanding how 'if' directive 
works.

Unless used with rewrite module directives (e.g. set) 'if' 
directive will create "hidden" location that will work as normal 
one if rewrite module processing stops in it (i.e. break directive 
used).  It doesn't really influence request processing if rewrite 
module processing doesn't stop there.

Since you have no 'break' in your "if ($request_uri ...)" - 
add_header and expires directives there doesn't matter.

It's somewhat ugly and one of the reasons why usage of 'if' is 
generally discouraged.

Instead, you should rewrite your configuration to something like 
this:

    location / {
        try_files $uri @proxy;
    }

    location @proxy {
        proxy_pass http://127.0.0.1:8089;
    }

    location /resources/ {
        try_files $uri @proxy_resources;
        add_header X-Foo 'bar';
        expires 30d;
    }

    location @proxy_resources {
        proxy_pass http://127.0.0.1:8089;
        add_header X-Foo 'bar';
        expires 30d;
    }

Maxim Dounin





More information about the nginx mailing list