Having trouble with the PCRE syntax

Hi,

would anybody please tell me what I’m doing wrong here?

location ~* ^/(forum|forums|board)/? {
rewrite ^/([^/])/(.*) http://forum.my_domain.com/$2
permanent;
}

I’d like to make it redirect visitors from
http://www.my_domain.com/forum (note: there’s no trailing slash),
http://www.my_domain.com/forum/, http://www.my_domain.com/forums (again,
there’s no trailing slash here), http://www.my_domain.com/forums/,
http://www.my_domain.com/board (…yep) and
http://www.my_domain.com/board/ to http://forum.my_domain.com/. Neither
the path (except “forum”/“forums”/“board”) nor the query (if there’s
one) should get cut off. It’s working so far, but it also redirects
visitors from ex. http://www.my_domain.com/forumfoobar/, which isn’t
what I want. :frowning:

Thanks in advance!

Posted at Nginx Forum:

Hi,

i’d write the end more like (/?|$), this would match if there
is a /, or if there is the end - i think.

Regards,
Sven

Am 11.03.2011 16:01, schrieb strike:

Thanks for your reply! But http://www.my_domain.com/forumfoobar/ still
redirects to http://forum.my_domain.com/. I don’t want that. :frowning:

Sven ‘Darkman’ Michels Wrote:

Hi,
I’d like to make it redirect visitors from
the query (if there’s
g-182278
[email protected]
nginx Info Page

Posted at Nginx Forum:

On Fri, Mar 11, 2011 at 10:01:03AM -0500, strike wrote:

Hi there,

would anybody please tell me what I’m doing wrong here?

location ~* ^/(forum|forums|board)/? {

You ask for /, forum, then one-or-no slash.

It’s working so far, but it also redirects
visitors from ex. http://www.my_domain.com/forumfoobar/, which isn’t
what I want. :frowning:

The second “f” in “forumfoobar” is one-or-no slash. (Specifically,
it is no slash). So it matches.

You want to ask for /, forum, then either a slash or end-of-string.

location ~* ^/(forum|forums|board)(/|$) {

(You could also abbreviate forum|forums to forums?, should you so
choose.)

Good luck,

f

Francis D. [email protected]

On Fri, Mar 11, 2011 at 03:40:08PM +0000, Francis D. wrote:

On Fri, Mar 11, 2011 at 10:01:03AM -0500, strike wrote:

Hi there,

A minor correction in the explanation:

location ~* ^/(forum|forums|board)/? {

You ask for /, forum, then one-or-no slash.

It’s working so far, but it also redirects
visitors from ex. http://www.my_domain.com/forumfoobar/, which isn’t
what I want. :frowning:

The second “f” in “forumfoobar” is one-or-no slash. (Specifically,
it is no slash). So it matches.

Strictly, it’s more like the region between the m and the f that is the
“no slash”, rather than the “f” itself.

But the pattern still matches :slight_smile:

f

Francis D. [email protected]

Hello!

On Fri, Mar 11, 2011 at 10:01:03AM -0500, strike wrote:

http://www.my_domain.com/forum (note: there’s no trailing slash),
http://www.my_domain.com/forum/, http://www.my_domain.com/forums (again,
there’s no trailing slash here), http://www.my_domain.com/forums/,
http://www.my_domain.com/board (…yep) and
http://www.my_domain.com/board/ to http://forum.my_domain.com/. Neither
the path (except “forum”/“forums”/“board”) nor the query (if there’s
one) should get cut off. It’s working so far, but it also redirects
visitors from ex. http://www.my_domain.com/forumfoobar/, which isn’t
what I want. :frowning:

Correct regexp-based solution would be

location ~* ^/(?:forum|forums|board)(?:/|$) {
    rewrite ^/[^/]*/*(.*) http://forum.my_domain.com/$2 permanent;
}

But recommended way is to avoid regexp-based solutions without
real need. It’s much simplier and much more scalable to write
configuration with normal static locations, i.e.

location = /forum {
    rewrite ^ http://forum.my_domain.com/ permanent;
}
location /forum/ {
    rewrite ^/forum/(.*) http://forum.my_domain.com/$1 permanent;
}
location = /board {
    rewrite ^ http://forum.my_domain.com/ permanent;
}
location /board/ {
    rewrite ^/board/(.*) http://forum.my_domain.com/$1 permanent;
}

This way you’ll save yourself a headache. As a side effect - it’s
faster.

Maxim D.

On Mar 11, 2011, at 20:33 , Maxim D. wrote:

location = /forum {
}

This way you’ll save yourself a headache.

[ when configuration will eventually grow.
And it will certainly grow eventually. ]

As a side effect - it’s
faster.

Maxim D.


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

Hello,

thank you guys and thanks a bunch for the explanation!

I’ll stick to what Maxim suggested, because it will definitively save me
from headaches. But it’s good to have the explanation and so to
understand what the problem was as the syntax looks like fundamental
knowledge to me.

Wow, even the creator himself spent some of his very spare time in
writing a reply. :smiley:

Thanks again!

Posted at Nginx Forum: