<div dir="ltr">I see, thanks for the explanation.</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Jan 14, 2014 at 8:27 PM, Ruslan Ermilov <span dir="ltr"><<a href="mailto:ru@nginx.com" target="_blank">ru@nginx.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">On Tue, Jan 14, 2014 at 06:54:44PM +0530, Fasih wrote:<br>
> Thanks! Could you please explain why this is done?<br>
<br>
</div>Modules register their handlers (at different phases<br>
of request processing) one by one, by adding an element<br>
into the corresponding array of handlers.  The order<br>
in which modules do this is somewhat important.<br>
<br>
For example, let's take a look at three standard "index"<br>
modules: autoindex, index, and random_index.  They are<br>
listed in auto/modules in the above mentioned sequence,<br>
and thus register their handlers in this sequence too.<br>
Their handlers are called in a reverse sequence, so it's<br>
either random index, or an index file, or an automatically<br>
generated directory listing, in this order.<br>
<br>
There are also 3rd party modules that are added to the<br>
list of modules at the end, and consequently register<br>
their handlers after the standard modules.  Now imagine<br>
you wrote a custom my_index module.  By processing<br>
handlers in a reverse order we give better chance for<br>
the 3rd party module to run.  If we did the opposite,<br>
then nginx would check the "index.html" file existence<br>
(the index module) before even calling your handler.<br>
<div class="HOEnZb"><div class="h5"><br>
> On Tue, Jan 14, 2014 at 4:41 PM, Maxim Dounin <<a href="mailto:mdounin@mdounin.ru">mdounin@mdounin.ru</a>> wrote:<br>
><br>
> > Hello!<br>
> ><br>
> > On Tue, Jan 14, 2014 at 04:15:32PM +0530, Fasih wrote:<br>
> ><br>
> > > Hi<br>
> > ><br>
> > > I have a custom plugin that handles rewrite (NGX_HTTP_REWRITE_PHASE).<br>
> > There<br>
> > > is another plugin compiled before my plugin that also handles rewrite<br>
> > > (HttpLuaModule). I was expecting to see that my module would rewrite<br>
> > after<br>
> > > lua is done, however that is not the case. Some debugging showed that<br>
> > > whereas my module pushed into the<br>
> > > cmcf->phases[NGX_HTTP_REWRITE_PHASE].handlers after lua, the<br>
> > > cmcf.phase_engine.handlers had lua *after* my module. The culprit seems<br>
> > to<br>
> > > be the following:<br>
> > ><br>
> > > static ngx_int_t<br>
> > > ngx_http_init_phase_handlers(ngx_conf_t *cf, ngx_http_core_main_conf_t<br>
> > > *cmcf)<br>
> > > {<br>
> > > ..<br>
> > >         ph = cmcf->phase_engine.handlers;<br>
> > > ..<br>
> > >         n += cmcf->phases[i].handlers.nelts;<br>
> > ><br>
> > >         for (j = cmcf->phases[i].handlers.nelts - 1; j >=0; j--) {<br>
> > >             ph->checker = checker;<br>
> > >             ph->handler = h[j];<br>
> > >             ph->next = n;<br>
> > >             ph++;<br>
> > >         }<br>
> > > }<br>
> > ><br>
> > > The order is inverted here (h[j] before h[j-1]). Is this intentional or a<br>
> > > bug?<br>
> ><br>
> > It's intentional.<br>
> ><br>
> > --<br>
> > Maxim Dounin<br>
> > <a href="http://nginx.org/" target="_blank">http://nginx.org/</a><br>
> ><br>
> > _______________________________________________<br>
> > nginx-devel mailing list<br>
> > <a href="mailto:nginx-devel@nginx.org">nginx-devel@nginx.org</a><br>
> > <a href="http://mailman.nginx.org/mailman/listinfo/nginx-devel" target="_blank">http://mailman.nginx.org/mailman/listinfo/nginx-devel</a><br>
> ><br>
<br>
<br>
</div></div><span class="HOEnZb"><font color="#888888">--<br>
Ruslan Ermilov<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
_______________________________________________<br>
nginx-devel mailing list<br>
<a href="mailto:nginx-devel@nginx.org">nginx-devel@nginx.org</a><br>
<a href="http://mailman.nginx.org/mailman/listinfo/nginx-devel" target="_blank">http://mailman.nginx.org/mailman/listinfo/nginx-devel</a><br>
</div></div></blockquote></div><br></div>