Problems with some rewrite

Greetings,

i’m currently facing a problem with some rewrites. Given an url i have
to rewrite it to a local folder.

url: www.domain.com/img/default/420006675369688559/image.png
doc root: /home/images/public/
local path (under doc root): 420/006/420006675369688559/default.png

So the rewrite rule should take the number and split it, taking the 1st
(420) and 2nd (006) three numbers out of the url and rewrite it to the
local path. But the number isn’t always that long, it may also be only 1
to 5 places long, e.g. 1, 12345 and 456 are possible. If the number is
less than 6 places long, the rewrite should fill up the missing places
with the character x.

Optional there’s a hyphen in front of the long number, e.g.
/img/default/-420006675369688559/image.png

Brilliant concept, but i wasn’t asked… So far, so bad. So i wrote some
rules, but as you might suggest, they don’t work. Here they are…

        # 1 number
        location "/img/default/-?([0-9] {1})/$" {
            rewrite "/img/default/([0-9-] {1})/(.*)\.(.*)$"
/$1xx/xxx/$1/default.$3;
        }
        # 2 numbers
        location "/img/default/-?([0-9] {2})/$" {
            rewrite "/img/default/([0-9-] {2})/(.*)\.(.*)$"
/$1x/xxx/$1/default.$3;
        }
        # 3 numbers
        location "/img/default/-?([0-9] {3})/$" {
            rewrite "/img/default/([0-9-] {3})/(.*)\.(.*)$"
/$1/xxx/$1/default.$3;
        }
        # 4 numbers
        location "/img/default/-?([0-9] {4})/$" {
            rewrite "/img/default/([0-9-] {3})([0-9] {1})/(.*)\.(.*)$"
/$1/$2xx/$1$2/default.$3;
        }
        # 5 numbers
        location "/img/default/-?([0-9] {5})+/$" {
            rewrite "/img/default/([0-9-] {3})([0-9] {2})/(.*)\.(.*)$"
/$1/$2x/$1$2/default.$3;
        }
        # 6 or more numbers
        location "/img/default/-?[0-9]+/$" {
            rewrite "/img/default/(-?[0-9]+ {3})(-?[0-9]+
{3})(-?[0-9]+)/(.*)\.(.*)$" /$1/$2/$3/default.$5 break;
        }

Maybe i don’t even need the locations… I’ve tried the last rule alone,
with a rewrite to a website, but even that doesn’t work, so there must
be some severe (logical) error in the location/rewrite rule.

Any help would be weclome :slight_smile:

Posted at Nginx Forum:

I’ve simplified the last rule a bit, to see where the problem might be.

rewrite "^/img/default/([0-9] {3})([0-9]
{3})/(.*)\.(gif|jpg|jpeg|png|tiff|bmp)$" http://www.google.com break;
->
rewrite "^/img/default/(.*)/(.*)\.(gif|jpg|jpeg|png|tiff|bmp)$"
http://www.google.com break;

So i replaced (-?[0-9] {3})(-?[0-9] {3})(-?[0-9]+) with (.*), and now
the rule works. So the problem is here: (-?[0-9] {3})(-?[0-9]
{3})(-?[0-9]+)

I took/adapted this rule from
Module ngx_http_rewrite_module , but for some (to
me unknown) reasons it isn’t working. Any idea?

well, nginx version: 0.6.32, debian lenny.

Posted at Nginx Forum:

On Tue, Aug 24, 2010 at 03:15:46AM -0400, revirii wrote:

(420) and 2nd (006) three numbers out of the url and rewrite it to the

    }
    # 5 numbers

Maybe i don’t even need the locations… I’ve tried the last rule alone,
with a rewrite to a website, but even that doesn’t work, so there must
be some severe (logical) error in the location/rewrite rule.

Any help would be weclome :slight_smile:

You DO need the locations, but you DO NOT need the rewrites.
Why do you use space in “([0-9] {2}” ?
Here is example for 2 numbers location:

 # 2 numbers
 location ~ ^/img/default/-?(\d{2})/.+\.(.+)$ {
     alias /home/images/public/$1x/xxx/$1/default.$2;
 }


Igor S.
http://sysoev.ru/en/

Igor S. Wrote:

You DO need the locations, but you DO NOT need the
rewrites.

ok.

Why do you use space in “([0-9] {2}” ?

Because space was used here:
http://wiki.nginx.org/NginxHttpRewriteModule#rewrite

Here is example for 2 numbers location:

 # 2 numbers
 location ~ ^/img/default/-?(\d{2})/.+\.(.+)$

{
alias
/home/images/public/$1x/xxx/$1/default.$2;
}

Hm, what is \d{2}? Is there any documentation? And:

nginx -t
2010/08/24 14:40:25 [emerg] 7386#0: pcre_compile() failed: missing ) in
"^/img/default/-?(\d"
2010/08/24 14:40:25 [emerg] 7386#0: the configuration file
/etc/nginx/nginx.conf test failed

I put it into “…”:

location ~ "^/img/default/-?(\d{2})/.+\.(.+)$"

But then i see:

2010/08/24 14:48:34 [emerg] 7449#0: the "alias" directive may not be
used inside location given by regular expression
2010/08/24 14:48:34 [emerg] 7449#0: the configuration file
/etc/nginx/nginx.conf test failed

Whats wrong now?

Thx in advance

Posted at Nginx Forum:

revirii Wrote:

Igor S. Wrote:

Hm, what is \d{2}? Is there any documentation?

hm, shame on my head. It’s for digit characters. I should work more with
regular expressions…

Posted at Nginx Forum:

On Tue, Aug 24, 2010 at 08:52:55AM -0400, revirii wrote:

Module ngx_http_rewrite_module
I think this is a bug in markup.

Whats wrong now?

Get 0.8.49 version. It’s stable enough. At least I use it on my job site
www.rambler.ru.


Igor S.
http://sysoev.ru/en/