Rewrite URI and pass request to the upstream server

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

Rewrite URI and pass request to the upstream server

Ruben. D.
Hi friends, I need rewrite and old URI and pass the request to the upstream server, here is my current config file:
http://pastie.org/418871

If for example I have http://pe.domain.com/xx-xxx-689 I need redirect to http://cl.domain.com/xx-xxx-689 and let the upstream process the new request, with my current config I've obtained the rewrite of the URI but nginx return me a 404 error, therefore it is not transfering the request to the upstream server because the 404 error page are different between nginx and my application.

Regards!

--
Rubén Dávila Santos.
http://rubenonrails.com
Reply | Threaded
Open this post in threaded view
|

Re: Rewrite URI and pass request to the upstream server

Michael Shadle
On Tue, Mar 17, 2009 at 10:09 AM, Ruben. D. <[hidden email]> wrote:

> Hi friends, I need rewrite and old URI and pass the request to the upstream
> server, here is my current config file:
> http://pastie.org/418871
>
> If for example I have http://pe.domain.com/xx-xxx-689 I need redirect to
> http://cl.domain.com/xx-xxx-689 and let the upstream process the new
> request, with my current config I've obtained the rewrite of the URI but
> nginx return me a 404 error, therefore it is not transfering the request to
> the upstream server because the 404 error page are different between nginx
> and my application.

This is a wild shot but you might try

- proxy_pass http://mongrel;
+ proxy_pass http://mongrel/;

I've never used named upstream locations but the ending slash does
have a different effect when passing HTTP to a backend. I believe it
maintains the /uri/ request as is, instead of winding up being
/uri/uri duplicated (I think is the easiest way to explain it?)

Also if you only have one mongrels server you could probably just do

proxy_pass http://127.0.0.1:3000/;

If you don't plan on adding anymore in the future...

Reply | Threaded
Open this post in threaded view
|

Re: Rewrite URI and pass request to the upstream server

Maxim Dounin
In reply to this post by Ruben. D.
Hello!

On Tue, Mar 17, 2009 at 12:09:29PM -0500, Ruben. D. wrote:

> Hi friends, I need rewrite and old URI and pass the request to the upstream
> server, here is my current config file:
> http://pastie.org/418871
>
> If for example I have http://pe.domain.com/xx-xxx-689 I need redirect to
> http://cl.domain.com/xx-xxx-689 and let the upstream process the new
> request, with my current config I've obtained the rewrite of the URI but
> nginx return me a 404 error, therefore it is not transfering the request to
> the upstream server because the 404 error page are different between nginx
> and my application.

According to your config, [new] request to cl.domain.com/xx-xxx-689
will end up in "location ~* [a-zA-Z]+(\-)+689$", which has no proxy_pass
rules.  You should either duplicate proxy_pass rules within this location, or
(better, faster, more scalable) separate pe.* and cl.* servers:

server {
    listen       80;
    server_name  pe.domain.com;

    location ~* [a-zA-Z]+(\-)+689$ {
        rewrite  ^  http://cl.domain.com$request_uri?;
    }

    ...
}

server {
    listen       80;
    server_name  www.domain.com domain.com cl.domain.com;

    ...
}

For identical config chunks within this servers you may want to
use include.

Maxim Dounin

Reply | Threaded
Open this post in threaded view
|

Re: Rewrite URI and pass request to the upstream server

Maxim Dounin
In reply to this post by Michael Shadle
Hello!

On Tue, Mar 17, 2009 at 10:19:58AM -0700, mike wrote:

> On Tue, Mar 17, 2009 at 10:09 AM, Ruben. D. <[hidden email]> wrote:
> > Hi friends, I need rewrite and old URI and pass the request to the upstream
> > server, here is my current config file:
> > http://pastie.org/418871
> >
> > If for example I have http://pe.domain.com/xx-xxx-689 I need redirect to
> > http://cl.domain.com/xx-xxx-689 and let the upstream process the new
> > request, with my current config I've obtained the rewrite of the URI but
> > nginx return me a 404 error, therefore it is not transfering the request to
> > the upstream server because the 404 error page are different between nginx
> > and my application.
>
> This is a wild shot but you might try
>
> - proxy_pass http://mongrel;
> + proxy_pass http://mongrel/;
>
> I've never used named upstream locations but the ending slash does
> have a different effect when passing HTTP to a backend. I believe it
> maintains the /uri/ request as is, instead of winding up being
> /uri/uri duplicated (I think is the easiest way to explain it?)

No.

Form of proxy_pass with uri component (proxy_pass http://mongrel/)
changes matched location prefix to this uri component.  So, for

    location /blah/ {
        proxy_pass http://backend/boom/;
    }

and request "/blah/something" your backend will see
"/boom/something".

Without uri component (proxy_pass http://mongrel) uri will be
transfered to backend as is, i.e. for

    location /blah/ {
        proxy_pass http://backend;
    }

and request "/blah/something" your backend will see
"/blah/something".

For location / as you may see from the above form doesn't matter,
and

    proxy_pass http://mongrel;
    proxy_pass http://mongrel/;

are equivalent (while the second one will eat a bit more CPU).

Maxim Dounin

Reply | Threaded
Open this post in threaded view
|

Re: Rewrite URI and pass request to the upstream server

Ruben. D.
Maxim, very thanks for your time, I've added another proxy_pass rule and it works fine ;)

mike: very thanks too!

Regards.

--
Rubén Dávila Santos.
http://rubenonrails.com
Reply | Threaded
Open this post in threaded view
|

Re: Rewrite URI and pass request to the upstream server

Michael Shadle
On Tue, Mar 17, 2009 at 2:51 PM, Ruben. D. <[hidden email]> wrote:
> Maxim, very thanks for your time, I've added another proxy_pass rule and it
> works fine ;)
>
> mike: very thanks too!

yeah, too bad i was totally backwards there. :)