Nginx reverse cache 301 redirects (permanent)

Is it possible to have Nginx cache all 301 redirect requests for proxy_pass?

For example:

Request #1: Client A requests /some/path -> sent to proxy_pass -> results in 301 redirect to /some/other/path -> nginx caches this response since it's a 301 redirect.

Request #2: Client B requests /some/path -> nginx returns cached 301 redirect to /some/other/path.


Solution 1:

nginx already can cache 301 redirects. You can change the amount of time they are cached with the proxy_cache_valid directive:

proxy_cache_valid 301 365d; # Cache permanent redirects for a whole year

Solution 2:

I found that @Michael's answer got me most of the way there, but when I turned on proxy_cache, it would automatically cache files with Expires and Cache-Control. So I ended up with this solution.

proxy_cache_path /tmp/nginx levels=1:2 keys_zone=main-cache:8m max_size=1000m inactive=600m;
proxy_temp_path /tmp/nginx/tmp;
proxy_cache main-cache;
proxy_cache_valid 301 60m;
proxy_cache_key "$scheme://$host$request_uri";
proxy_ignore_headers X-Accel-Expires Expires Cache-Control;