When using nginx as a caching proxy, I found myself needing to ignore particular parameters for both the cache key and the values being passed to the backend. In this particular situation the value I wanted to ignore was ‘uid’. An example URI being:
http://myapplication.fqdn/foo.ext?env=bar&uid=baz&node=qux
or
http://myapplication.fqdn/foo.ext?uid=bar
To ignore this, in the top of my site configuration I put:
proxy_cache_key "$scheme$host$uri$is_args$args";
in the server stanza:
if ($args ~ (.*?)(?:^|(&))uid=[^&]*(?:(\2.*)|&(.*))?) {
set $args $1$3$4;
}
if ($args ~ (^w)) {
set $args ?$args;
}
and the location stanza:
proxy_pass http://appservers$uri$args;
So now my backend servers see:
GET /foo.ext?env=bar&node=qux
or
GET /bar.ext
and seldom few hits get through to there anyway, as the cache key flattens it appropriately.
Easy.
EDIT: The ‘easy’ bit is a lie, it seems. Thanks to @davidgl for pulling me out of regex hell. Several revisions here helped by him.