有可能在HTTP中cachingPOST方法?

用非常简单的caching语义:如果参数是相同的(当然URL是相同的),那么这是一个打击。 那可能吗? 推荐的?

如果您使用适当的标头,第9.5节(POST)中相应的RFC 2616允许将响应caching到POST消息。

除非响应包含适当的Cache-Control或Expires头字段,否则对此方法的响应不可caching。 但是,303(请参阅其他)响应可用于指导用户代理检索可caching资源。

请注意,在第13节(HTTPcaching)中明确指出,caching必须在POST 请求后使对应的实体无效。

一些HTTP方法必须导致caching使实体无效。 这可以是Request-URI引用的实体,也可以是Location或Content-Location头(如果存在)。 这些方法是:

- PUT - DELETE - POST 

我不清楚这些规范如何允许有意义的caching。

根据RFC 2616第9.5节:

“响应POST方法不可caching,除非响应包含适当的caching控制或过期头字段。

所以,是的,你可以cachingPOST请求响应,但只有当它到达适当的头。 在大多数情况下,您不想caching响应。 但是在某些情况下(比如,如果你没有在服务器上保存任何数据),这是完全合适的。

请注意,无论头文件是多less,包括当前Firefox 3.0.10在内的许多浏览器都不会cachingPOST响应。 IE在这方面performance得更加巧妙。

现在,我想澄清关于RFC 2616 S. 13.10的一些混淆。 正如一些人在这里所说的那样,一个URI的POST方法不会“使caching资源无效”。 它使该URI的旧caching版本陈旧,即使其caching控制标头指示更新持续时间更新。

总体:

基本上POST不是一个幂等操作 。 所以你不能用它来caching。 GET应该是一个幂等操作,所以通常用于caching。

请参阅HTTP 1.1 RFC 2616 S. 9.1的第9.1节 。

除了GET方法的语义:

POST方法本身在语义上是为了将某些东西发布到资源上。 POST不能被caching,因为如果你做了一次,两次或三次,那么你每次都在改变服务器的资源。 每个请求都很重要,应该交付给服务器。

PUT方法本身在语义上是为了放置或创build资源。 这是一个幂等操作,但不会用于caching,因为DELETE可能同时发生。

DELETE方法本身在语义上是为了删除资源。 这是一个幂等操作,但不会用于caching,因为PUT可能同时发生。

关于客户端caching:

Web浏览器将始终转发您的请求,即使它有来自以前的POST操作的响应。 例如,您可能会隔几天发送带有Gmail的电子邮件。 他们可能是相同的主题和身体,但都应该发送电子邮件。

关于代理caching:

将消息转发到服务器的代理HTTP服务器永远不会caching除GET或HEAD请求之外的任何内容。

关于服务器caching:

默认情况下服务器不会通过检查caching来自动处理POST请求。 但是,当然POST请求可以发送到您的应用程序或加载项,并且您可以拥有自己的caching,当参数相同时您可以读取它们。

使资源无效:

检查HTTP 1.1 RFC 2616 S. 13.10显示POST方法应该使caching资源无效。

如果它实际上并没有改变你网站上的数据,那应该是一个GET请求。 即使这是一种forms,您仍然可以将其设置为获取请求。 虽然像其他人一样指出,你可以caching一个POST的结果,但它不会产生语义,因为一个POST定义是在改变数据。

如果你caching一个POST响应,它必须在Web应用程序的方向。 这就是“对此方法的响应不可caching,除非响应包含适当的caching控制或过期标头字段”。

人们可以安全地假定知道POST结果是否是幂等的应用程序决定是否附加必要和正确的caching控制标题。 如果存在允许caching的caching头,应用程序会告诉你,POST实际上是一个超级GET; 由于执行幂等操作所需的不必要的和不相关的数据(使用URI作为caching键),所以仅需要使用POST。

在此假设下,可以从caching服务器接收GET。

如果应用程序无法附加必要和正确的标头,以区分可高速caching和不可高速caching的POST响应,则会导致无效caching结果出错。

也就是说,每个到达caching的POST都需要使用条件头进行validation。 这是为了刷新caching内容所必需的,以避免POST的结果不会反映到对请求的响应中,直到对象的生命周期过期。

当然这是可能的。 如果你想捕获发送到你的服务器的POST请求,并caching发回的数据以后重新发送 – 没有汗水。

棘手的部分来关于“国家”。 你如何确定你想发回给用户的数据应该是一样的? 如果他的cookies发生了变化 – 那么这会改变你想要发回的数据吗?

如果用户向你的主页发出了一个POST请求,并且自从他上一次这么做以后,另一个用户给他发了一条消息(在你的站点内部使用了一些系统)。你将不得不把它看作是一个状态改变,并发送新版本的主页,并在下次加载主页时向用户发送关于该消息的通知。 即使POST参数是相同的。

Mark Nottingham分析了何时可以cachingPOST的响应。 请注意,希望利用caching的后续请求必须是GET或HEAD请求。 另见httpbis

POST不会处理已标识状态的表示,99次出现100次。但是,有一种情况发生, 当服务器无法通过设置与请求URI相同的Content-Location头来表示这个POST响应是其URI的表示时。 发生这种情况时,POST响应就像对同一个URI的GET响应一样; 它可以被caching和重用 – 但仅限于将来的GET请求。

https://www.mnot.net/blog/2012/09/24/caching_POST

使用firefox 27.0和httpfox,2014年5月19日,我看到了这样一行:00:03:58.777 0.488 657(393)POST(Cache)text / html https://users.jackiszhp.info/S4UP

显然,post方法的响应被caching,并且也在https中。 难以置信的!

POST用于有状态的Ajax。 为POST返回一个caching的响应会破坏通信通道和接收消息的副作用。 这是非常糟糕的。 跟踪也是一个真正的痛苦。 强烈build议反对。

一个微不足道的例子就是一个消息,作为一个副作用,本周你的工资是$ 10,000。 你不想得到“OK,通过了!” 返回上周caching的页面。 其他更复杂的现实世界的案例会导致相似的闹剧。