对 POST 请求的响应只有在包含
明确的新鲜度资料(见[ RFC7234]第4.2.1节)。
然而,POST 缓存并没有得到广泛的实现。
对于原始服务器希望客户端能够
缓存 POST 的结果,以便以后可以重用
GET,原始服务器可能会发送一个包含
Result 和具有相同值的 Content-Location 标头字段
作为 POST 的有效请求 URI (3.1.4.2节)。
根据这一点,缓存 POST 的结果(如果服务器指示了这种能力)随后可以用作相同 URI 的 GET 请求的结果。
Mark Nottingham 分析了何时可以缓存 POST 的响应。请注意,希望利用缓存的后续请求必须是 GET 或 HEAD 请求。参见 http semantics
POST 不处理已识别状态的表示,100次中有99次。
但是,有一种情况是这样的: 当服务器从
它表示这个 POST 响应是它的 URI 的表示,
通过设置与请求相同的 Content-Location 标头
当这种情况发生时,POST 响应就像 GET 响应一样
它可以被缓存和重用——但只能用于将来
获取请求。
13.10 Invalidation After Updates or Deletions
..
Some HTTP methods MUST cause a cache to invalidate an entity. This is
either the entity referred to by the Request-URI, or by the Location
or Content-Location headers (if present). These methods are:
- PUT
- DELETE
- POST
这种语言表明 POST 请求是不可缓存的,但在本例中并非如此。缓存仅对以前存储的数据无效。RFC (似乎)明确说明,是的,您可以缓存 POST请求:
9.5 POST
..
Responses to this method are not cacheable, unless the response
includes appropriate Cache-Control or Expires header fields. However,
the 303 (See Other) response can be used to direct the user agent to
retrieve a cacheable resource.
13.11 Write-Through Mandatory
..
All methods that might be expected to cause modifications to the
origin server's resources MUST be written through to the origin
server. This currently includes all methods except for GET and HEAD.
A cache MUST NOT reply to such a request from a client before having
transmitted the request to the inbound server, and having received a
corresponding response from the inbound server. This does not prevent
a proxy cache from sending a 100 (Continue) response before the
inbound server has sent its final reply.
这有什么意义呢? 好吧,你不是在缓存 POST请求,你是在缓存资源。
POST 响应正文只能缓存到同一资源的后续 GET 请求。在 POST 响应中设置 Location或 Content-Location标头,以通信正文表示的资源。因此,缓存 POST 请求的唯一技术上有效的方法是将后续 GET 缓存到同一资源。
正确答案是两者皆有:
是的,RFC 允许您将后续 GET 的 POST 请求缓存到相同的资源
不,RFC 不允许缓存后续 POST 的 POST 请求,因为 POST 不是幂等的,必须通过写入服务器
尽管 RFC 允许将请求缓存到相同的资源,但实际上,浏览器和 CDN 不实现这种行为,也不允许您缓存 POST 请求。