对于大型请求正文,将忽略Nginx proxy_cache_key $ request_body

时间:2013-09-13 21:42:28

标签: http nginx reverse-proxy multipartform-data cache-control

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

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

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

是什么导致这个?如何配置nginx以在$request_body中使用$request_body(或proxy_cache_key的哈希值),即使对于大型POST请求也是如此?

2 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分: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";