Rewrite URI and pass request to the upstream server

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!

On Tue, Mar 17, 2009 at 10:09 AM, Ruben. D. [email protected]
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

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…

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 D.

Maxim, very thanks for your time, I’ve added another proxy_pass rule and
it
works fine :wink:

mike: very thanks too!

Regards.

On Tue, Mar 17, 2009 at 2:51 PM, Ruben. D. [email protected]
wrote:

Maxim, very thanks for your time, I’ve added another proxy_pass rule and it
works fine :wink:

mike: very thanks too!

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

Hello!

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

and my application.

This is a wild shot but you might try

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 D.