Question: I have these rewrite rules (I tried both with no avail):

```
location ~* "^/([a-z0-9]{32})\.png$" {
  rewrite ^ /index.php?page=log&id=$1 last;
} 

```

and

```
location ~* "/(?<hash>[a-z0-9]{32})\.png" {
  rewrite ^ /index.php?page=log&id=$hash;
}

```

and

```
location / {
  try_files $uri $uri/ @rewrites;
}

location @rewrites {
  rewrite "^/([a-zA-Z0-9]{32})\.png$" /index.php?page=log&id=$1 last;
  #...
}

```

Basically, I want the URL `http://example.com/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.png` to actually pass the parameters to my `index.php` script, and in the script, I got:

```php
$db->save_hash($_GET['id']);
header('Content-type: image/png');
readfile('images/beacon.png');
break;

```

But nginx is giving me a "not found", but other rewrites work fine. What gives?

Answer: 
this one worked for me:

```
    location / { 
    rewrite "/([a-z0-9]{32})\.png" /index.php?page=log&id=$1 break;
    }

```

Or if you want separeted location:

```
location ~* "/([a-z0-9]{32})\.png" {
rewrite /(.*) /index.php?page=log&id=$1 last;
}

```
While @unlo's answer seems correct to me (tried myself on a clean virtualhost), I see one more optimisation. Instead of serving a static file by your script, you may want to use [XSendFile](http://wiki.nginx.org/XSendfile) feature to make nginx serve these files.