12

我使用 nginx 作为反向代理,我希望它缓存 POST 请求。我的后端已正确配置为为 POST 请求返回适当的缓存控制标头。在 nginx 中,我配置了:

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

这适用于小型 HTTP POST 请求。但是我开始注意到对于大型请求(例如文件上传),它似乎$request_bodyproxy_cache_key. 当包含文件上传的表单以完全不同的数据提交两次时,nginx 将返回缓存的结果。

什么可能导致这种情况?我如何配置 nginx 以在大型 POST 请求中使用$request_body(或哈希$request_body) ?proxy_cache_key

4

2 回答 2

16

所以事实证明,当$content_length > client_body_buffer_size请求正文被写入文件和变量时$request_body == ""

另见http://mailman.nginx.org/pipermail/nginx/2013-September/040442.html

于 2013-09-24T16:00:30.293 回答
1

您可以更简单地使用 $content_length,而不是在 proxy_cache_key 中使用 $request_body。当然,它有其自身的局限性,但如果您知道您将收到哪个查询,这也是一个非常有趣的解决方法。

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

您也可以使用 $request_body 来为较小的请求有效负载保持所需的行为:

proxy_cache_key "$scheme$request_method$host$request_uri$request_body$content_length";
于 2019-01-05T18:41:49.523 回答