Nginx proxy_cache_key $request_body is ignored for

2020-07-06 03:38发布

I use nginx as a reverse proxy and I would like it to cache POST requests. My back-end is correctly configured to return appropriate cache-control headers for POST requests. In nginx I have configured:

proxy_cache_methods POST;
proxy_cache_key "$request_method$request_uri$request_body";

This works great for small HTTP POST requests. However I started noticing that for large requests (e.g. file uploads) it seems like the $request_body is ignored in the proxy_cache_key. When a form containing a file upload is submitted twice with completely different data, nginx will return the cached result.

What could cause this? How can I configure nginx to use the $request_body (or a hash of $request_body) in the proxy_cache_key even for large POST requests?

2条回答
Bombasti
2楼-- · 2020-07-06 04:08

Rather than using the $request_body within the proxy_cache_key, you may more simply use $content_length. Of course, it comes with its own limitation, but if you know which query you will receive, it can be also a very interesting workaround.

proxy_cache_key "$scheme$request_method$host$request_uri$content_length";

You may alternatively use $request_body as well to keep the desired behavior for smaller request payload:

proxy_cache_key "$scheme$request_method$host$request_uri$request_body$content_length";
查看更多
可以哭但决不认输i
3楼-- · 2020-07-06 04:12

So it turns out that when $content_length > client_body_buffer_size, then the request body is written to a file and the variable $request_body == "".

See also http://mailman.nginx.org/pipermail/nginx/2013-September/040442.html

查看更多
登录 后发表回答