question about ngx_http_named_location
Maxim Dounin
mdounin at mdounin.ru
Fri Aug 31 18:52:26 UTC 2012
Hello!
On Wed, Aug 29, 2012 at 02:43:04PM +0300, Anatoli Marinov wrote:
> Hello Mates,
> I am wondering why in ngx_http_named_location is used a segment of
> code that resets all modules contexts. I mean the line
> ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module);.
> My opinion is that the module context should not be touched outside
> of the certain module. Is there a special reason for this patch? Is
> there a case which requires it?
There was more than one case where not clearing of module
contexts in ngx_http_named_location() was causing problems, see
here for more details:
http://mailman.nginx.org/pipermail/nginx-devel/2011-October/001329.html
As this behaviour wasn't something designed (rather a bug, even if
not affecting official modules), nor something consistent with
other similar code (i.e. clearing module contexts on internal
redirects), hence it was decided that it's better to clear context
than to don't.
As for clearing module contexts on internal redirects (in contrast
to named locations - where behaviour was changed recently, and the
change is explained above), it allows to simplify module
development as modules don't need to keep track of request
processing history. And actually it semantically does what internal
redirect is expected to do: start another request with another
uri.
There is at least one way to preserve data between both internal
redirects and named location changes (as well as subrequests,
actually), via variables. (It's somewhat a hack, but it works and
it's expected to work. You may try searching mailing list
archives for more details, I believe I explained this at least
once.)
Maxim Dounin
More information about the nginx-devel
mailing list