I recently need to set up caching for a very slow API service I was working with. However the app I was working with forced a query param of “timestamp” on all requests. This effectively killed the cache because all api requests were flowing through a single endpoint, and only the query params differentiated the requests. So here’s how to set up caching and strip out query params with nginx.
http {
# Create a storage location for
# caching and call this location "my-app"
proxy_cache_path /data/nginx/cache levels=1:2
keys_zone=global:10m
max_size=100m inactive=60m;
server {
location /api/ {
# Strip out query param "timestamp"
if ($args ~ (.*)×tamp=[^&]*(.*)) {
set $args $1$2;
}
# Use the "my-app" cache defined above
proxy_cache my-app;
# Only cache 200 responses and cache for 20mins
proxy_cache_valid 200 20m;
# Create a unique cache key
proxy_cache_key
"$scheme$request_method$host$uri$is_args$args";
# Proxy the request
proxy_pass http://myapi.com;
}
}


The technique above seems to be the standard answer, unfortunately it does not work if it’s the first parameter being removed.
I this it can be enhanced using
(.*)[?&]timestamp=[^&]*(.*)