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=[^&]*(.*)