add_header not allowed in server if blocks?

Maxim Dounin mdounin at
Tue Jun 15 05:35:54 MSD 2010


On Mon, Jun 14, 2010 at 07:04:21PM -0400, steveh wrote:

> I'm trying to add support for google chrome frame to our nginx 
> config the simple way would be to include a fragment in each 
> server block which looks something like:
>     if ( $http_user_agent ~ chromeframe ) {
>         add_header X-UA-Compatible "chrome=1";
>     }

Just adding X-UA-Compatible unconditionally should be sufficient, 
but if you really want to return it to chrome frame only, try 
something like this:

    set $tt "";

    if ($http_user_agent ~ chromeframe) {
        set $tt "chrome=1";

    add_header X-UA-Compatible $tt;

Note well: add_header used in location would reset inherited 
add_header directives (usual array inheritance rules apply), so 
you have to repeat add_header in such locations (if any).
> The problem is for some reason add_header isn't allowed in 
> server-if blocks on location-if blocks. I can't see or think of 
> a reason why this shouldn't be allowed?

Actually, the real question is "why it's allowed in 'if in 
location' blocks".  The answer seems to be "uh, it was a mistake".  
See here for details:

> So I tried adding it and it seems to work without a problem. The 
> following patch, made against 0.8.40, adds server if block 
> support for both expires and add_header.

You didn't tested it well enough.  It does nothing but removes 
config parsing error.

Maxim Dounin

More information about the nginx mailing list