nginx bug

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


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;
>                 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 

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 

    location / {
        try_files $uri @proxy;

    location @proxy {

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

    location @proxy_resources {
        add_header X-Foo 'bar';
        expires 30d;

Maxim Dounin

More information about the nginx mailing list