支持 POST 的 HTTP 缓存服务器

支持 POST 的 HTTP 缓存服务器

我托管了一个 REST 服务,该服务正在发送适当的缓存控制标头。我使用 Varnish 作为 Web 服务器前面的缓存服务器。但是,Varnish 的一个限制是它不支持缓存 HTTP POST 和 HTTP PUT。是否有其他缓存服务器可以缓存这些请求?

我知道缓存 POST 有点棘手,因为您不能像 GET 那样仅根据 URL 作为键进行缓存;它需要实际检查请求正文。对于multipart/form-data请求,可能应该对要缓存的请求正文的大小进行限制(以便不会缓存大文件上传等)。不过,我真的希望能够缓存短 HTTP POST,或者至少缓存那些application/x-www-form-urlencoded

答案1

缓存的主要思想是无需询问后端系统即可对同一请求提供相同的响应。POST 请求的问题在于,您必须检查正文才能确定两个请求是否相同。最好的解决方案是从 POST 更改为 GET。

如果这不适用你可以尝试Nginx 的代理模块使用以下设置(参见身体尺寸所需的限制):

location @apache_backend {
    ...
    proxy_cache_methods   POST;
    proxy_cache_key       "$uri|$request_body";
    client_max_body_size  1k;
}

答案2

您的问题已标记为,但显然你不知道proxy_cache_methodsproxy_cache_key指令这也允许您代理 POST 响应,前提是您的服务器使用缓存控制标头进行 POST 响应。

这个想法是将该POST方法包含在 proxy_cache_methods 中,并找到合适的行proxy_cache_key。的默认值$scheme$proxy_host$request_uri;不会像您想象的那样工作得很好,但您可以从大量列表中进行选择Nginx 变量得到能满足你需要的东西。

相关内容