![支持 POST 的 HTTP 缓存服务器](https://linux22.com/image/581356/%E6%94%AF%E6%8C%81%20POST%20%E7%9A%84%20HTTP%20%E7%BC%93%E5%AD%98%E6%9C%8D%E5%8A%A1%E5%99%A8.png)
我托管了一个 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
您的问题已标记为nginx,但显然你不知道proxy_cache_methods
和proxy_cache_key
指令这也允许您代理 POST 响应,前提是您的服务器使用缓存控制标头进行 POST 响应。
这个想法是将该POST
方法包含在 proxy_cache_methods 中,并找到合适的行proxy_cache_key。的默认值$scheme$proxy_host$request_uri;
不会像您想象的那样工作得很好,但您可以从大量列表中进行选择Nginx 变量得到能满足你需要的东西。