如何缓存HTTP POST响应?

10

我希望为一个POST请求创建可缓存的HTTP响应。

我的当前实现对POST请求做出了以下响应:

HTTP/1.1 201 Created
Expires: Sat, 03 Oct 2020 15:33:00 GMT
Cache-Control: private,max-age=315360000,no-transform
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 9
ETag: 2120507660800737950
Last-Modified: Wed, 06 Oct 2010 15:33:00 GMT

.........

但是看起来浏览器(已测试过的Safari、Firefox)并没有缓存响应结果。

HTTP RFC中对应的部分如下:

除非响应包含适当的Cache-Control或Expires头字段,否则此方法的响应不可缓存。但是,可使用303(See Other)响应来指示用户代理检索可缓存资源。

因此我认为它应该可以被缓存。我知道我可以设置一个会话变量并设置一个cookie并进行303重定向,但我想缓存POST请求的响应。

有什么办法可以做到这一点吗?

P.S .:我从一个简单的200 OK开始,所以它不起作用。


对于帖子的响应通常根据发布的参数是独特的,因此通常没有缓存它的意义。你的回答是什么?我有一种感觉,你正在做一些不完全正确的事情。 - Bart van Heukelom
这将是一个类似商店的东西。如果有人向某个URL发布内容,它将在指定位置为此客户端存储内容。因此,客户端可以缓存它,不需要重新检查位置,因为它将与当前客户端发布的内容相同。 - KARASZI István
我通过使用带有自定义头部(用于值)的AJAX GET请求解决了实际问题。但是我仍然对这个问题感兴趣。 - KARASZI István
1
可能是Is it possible to cache POST methods in HTTP?的重复问题。 - Alexei Levenkov
3个回答

3

我想提醒一下,缓存始终是可选的(在HTTP/1.1 RFC中是MAY)。由于在大多数情况下,成功的POST请求会使缓存项无效,所以你看到的浏览器缓存可能只是不实现缓存POST响应(因为这是相当罕见的 - 通常可以通过按GET格式处理来解决,听起来你已经做到了这一点)。


0

简短回答:POST缓存很少有意义。缓存可能为与先前的POST相同的URL提供GET请求,其响应带有包含POST请求URI的Content-Location标头。

来自rfc-7231(http-bis,取代rfc-2616):

仅当POST请求包括显式新鲜度信息时(请参见[RFC7234]的第4.2.1节),才可以缓存对POST请求的响应。
但是,POST缓存并不广泛实现。 对于源服务器希望客户端能够以后重用的方式缓存POST结果的情况,源服务器
可以发送一个包含结果和Content-Location标头字段的200(OK)响应,该标头字段具有与POST的有效请求URI相同的值(第3.1.4.2节)。

另请参见Mark Nottinghams Blog

POST请求通常不涉及已识别状态的表示,99次中有99次都是如此。然而,有一种情况例外,即当服务器特意声明此POST响应是其URI的表示形式时,通过设置Content-Location标头与请求URI相同。当发生这种情况时,POST响应就像对同一URI的GET响应一样;它可以被缓存和重用,但仅限于将来的GET请求。
RFC还描述了一个PRG序列,具有类似的效果,允许POST的响应周期填充缓存以供后续的GET使用 - 这可能更广泛地实现。

-1
你能否尝试将 Cache-Control 改为 public 而不是 private,看看是否有效?

我会尝试,但内容不应该被公开缓存。 - KARASZI István

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接