Getting rewritten and encoded/escaped url in nginx module

Hi,

I am writing a nginx proxy module and want to grab the url which is
urlencoded (as the client sends it) and also after rewrite rules are
applied. My typical url looks like :
path1/path2/path3/urlencoded(key)?args, after rewriting the url I would
love to have is something like :

newpath1/newpath2/newpath3/…/urlencoded(key)?args.

Currently , r->uri is decoded rewritten uri, r->unparsed_uri is encoded
but not rewritten.

I read on the forum that nginx decodes the url for rewrite, is there a
handy internal function I can use encode the rewritten url back. A
simple use of ngx_escape_uri(r->uri) with different parameters doesn’t
do what I want out of the box.

Thanks,
Jayadev

I am not providing a direct answer but could not you use some standard
modules to do that?

Such as using (examples):


B. R.

Hello!

On Tue, Jun 03, 2014 at 09:42:41AM -0700, Jayadev C wrote:

newpath1/newpath2/newpath3/…/urlencoded(key)?args.

Currently , r->uri is decoded rewritten uri, r->unparsed_uri is
encoded but not rewritten.

I read on the forum that nginx decodes the url for rewrite, is
there a handy internal function I can use encode the rewritten
url back. A simple use of ngx_escape_uri(r->uri) with different
parameters doesn’t do what I want out of the box.

The ngx_escape_uri(r->uri) is the internal function you should
use if you need encoded URI.

If in doubt, try looking, e.g., into the ngx_http_proxy_create_request()
function to see how it’s done there.


Maxim D.
http://nginx.org/

The problem is ngx_http_proxy doesn’t do that either, once rewrite is
applied the url remains decoded (or I am not reading the code
correctly). In fact escaping uri back is a bit tricky since you have to
split the rewritten url to segments and apply encoding again (which
would require looking at the original url to know the correct number of
'/'s).

Anybody had attempted doing something like this ? or is there an easier
way.

Jayadev

On Tuesday, June 3, 2014 10:17 AM, Maxim D. [email protected]
wrote:

Hello!

On Tue, Jun 03, 2014 at 09:42:41AM -0700, Jayadev C wrote:

newpath1/newpath2/newpath3/…/urlencoded(key)?args.

Currently , r->uri is decoded rewritten uri, r->unparsed_uri is
encoded but not rewritten.

I read on the forum that nginx decodes the url for rewrite, is
there a handy internal function I can use encode the rewritten
url back. A simple use of ngx_escape_uri(r->uri) with different
parameters doesn’t do what I want out of the box.

The ngx_escape_uri(r->uri) is the internal function you should
use if you need encoded URI.

If in doubt, try looking, e.g., into the ngx_http_proxy_create_request()
function to see how it’s done there.


Maxim D.
http://nginx.org/

Hello!

On Tue, Jun 03, 2014 at 02:08:36PM -0700, Jayadev C wrote:

The problem is ngx_http_proxy doesn’t do that either, once
rewrite is applied the url remains decoded (or I am not reading
the code correctly).

The proxy does ngx_escape_uri() if URI was rewritten. It has to,
as unencoded URI can’t be used in a HTTP request. Take a look at
the ngx_http_proxy_create_request() function as previously
suggested.

In fact escaping uri back is a bit tricky
since you have to split the rewritten url to segments and apply
encoding again (which would require looking at the original url
to know the correct number of '/'s).

As long as there were encoded slashes, the encoding of these
slashes will be lost if URI was rewritten. This is the expected
behaviour.


Maxim D.
http://nginx.org/