Help getting regexp to match to set expires headers

Maxim Dounin mdounin at mdounin.ru
Sun Feb 7 05:44:01 MSK 2010


Hello!

On Sat, Feb 06, 2010 at 05:51:12PM -0800, Tim Wong wrote:

> Hi there,
> 
> I'm trying to get nginx to set expires headers only for assets that have
> timestamps at the end of them but am having trouble figuring out exactly
> what to put in the conf file.  Would anybody be able to help me out?
> 
> Here's what I've tried:
> 
> # Trying to set expires headers for /test.png?1265332681 but not for /test.png
> 
> # Works for /test.png?1265332681 but also matches /test.png
> location ~* \.(htc|ico|css|js|gif|jp?g|png)(\?[0-9]+)?$ {

Location match on path only, without query string, so this won't 
work.

Just a side note: probably you mean "...|jpe?g|..."?

>      expires max;
>      break;

Another side note: using "break" is pointless here, it just wastes 
CPU cycles.

> }
> 
>   # No expires headers set
>   location ~* \.(ico|css|js|gif|jp?g|png)(\?[0-9]+)$ {
>        expires max;
>        break;
>   }

Try this instead:

    location ~* \.(ico|css|js|gif|jpe?g|png)$ {
         if ($args) {
             expires max;
         }
    }

Note well: this will work, but you may find it doing strange 
things once you add more directives into the above location, see 
http://wiki.nginx.org/IfIsEvil for details.

Most generic solution is to use something like this:

    location ~* \.(ico|css|js|gif|jpe?g|png)$ {
        error_page 405 = @expiresmax;
        recursive_error_pages on;

        if ($args) {
            return 405;
        }

        ...
    }

    location @expiresmax {
        expires max;
    }

Maxim Dounin



More information about the nginx mailing list