The addition before sub

Witold Filipczyk witekfl at gazeta.pl
Thu Jun 6 15:43:14 UTC 2013


W dniu 06.06.2013 o 15:57 Maxim Dounin <mdounin at mdounin.ru> pisze:

> Hello!
>
> On Thu, Jun 06, 2013 at 03:41:53PM +0200,  Witold Filipczyk wrote:
>
>> Hello,
>> I want to inject something before </body> and before </head>, but
>> even if there is no </body>.
>> So used add_after_body /after_body;
>> /after_body returns the text </body>, so there is at least one
>> </body> in the page.
>> I wanted sub_filter to replace </body> to SOMETHING</body>, but the
>> sub_filter is run before the addition_filter.
>> Changing the order in modules doesn't help, because the sub_filter
>> doesn't replace the text from subrequests.
>
> Works fine here:
>
>     location / {
>         add_after_body /after.html;
>         sub_filter 'foo' 'bar';
>     }
>
> $ cat main.html
> this is main.html: foo
> $ cat after.html
> this is in after.html: foo
> $ fetch -qo - 'http://localhost:8080/main.html'
> this is main.html: bar
> this is in after.html: bar
>
> The explanation is simple: addition filter uses _subrequests_ to
> add text, and these subrequests are in turn processed by the whole
> filter chain, including the sub filter.  Hence order of sub and
> addition filters doesn't matter.
>
> Most likely it doesn't work for you because /after_body have some
> default mime type not matched by sub_filter_types, see
> http://nginx.org/r/sub_filter_types.

OK. It works, but:

server {
    listen 8000;
    sub_filter 'foo' 'bar';
    sub_filter_once on;

    location / {
       root /;
       add_after_body /after.html;
    }

    location = /after.html {
       root /;
    }
}

/after.html contains "lalala foo"
/body.html contains "foo"

http://localhost:8000/body.html:
bar lalala bar

I expected:
bar lalala foo

How to switch off sub_filter for location = /after.html to get expected  
result?



More information about the nginx-devel mailing list