发送带有404响应的cache-control / expires / pragma -有效/被现代浏览器理解


sending cache-control / expires / pragma with 404 response - valid / understood by modern browsers?

我们正在努力减少一些'无意义'的交通。

如果我们发送有效的缓存控制标头(如"do cache")和404响应,现代浏览器会缓存所请求的资源不存在吗?

我们使用基于自定义PHP的404处理程序,该处理程序由于会话创建而发送不缓存头,因此我们删除了这些头。但现在想知道,如果资源我们是某些是无效的,我们应该发送适当的缓存头?

这些是公共资源,顺便说一下,所有用户都可以通过相同的uri访问。

谢谢!

现代浏览器有一个理想的接近标准的HTTP协议实现,代理服务器也是如此,如果你想对用户和非故意的机器人流量产生影响,你应该考虑到这一点。当前版本为1.1,部分节选:

10.4客户端错误4xx

4xx类状态码用于客户端似乎出错的情况。除了响应HEAD请求外,服务器应该包含一个实体来解释错误情况,以及它是临时的还是永久的。这些状态码适用于任何请求方法。用户代理应该向用户显示任何包含的实体。

如果客户端正在发送数据,使用TCP的服务器实现应该小心地确保客户端在服务器关闭输入连接之前确认收到包含响应的数据包。如果客户端在关闭后继续向服务器发送数据,服务器的TCP堆栈将向客户端发送一个重置数据包,这可能会在客户端未被确认的输入缓冲区被HTTP应用程序读取和解释之前擦除它们。

更具体地说是404:

10.4.5 404 Not Found

服务器没有找到任何与请求uri匹配的内容。没有迹象表明这种情况是暂时的还是永久性的。如果服务器通过一些内部可配置的机制知道旧资源永久不可用并且没有转发地址,则应该使用410 (Gone)状态码。此状态码通常在服务器不希望确切地显示请求被拒绝的原因时使用,或者当没有其他响应适用时使用。

404响应码到此为止。

你问:

现在[我们]想知道如果我们确定资源是无效的,我们应该发送正确的缓存头吗?

你没有给出你想要使用的任何特定的缓存头,所以回答你的问题有点不精确。13 HTTP中的缓存.

一般来说,下面应该是你要找的,摘自13.1.1缓存正确性:

一个正确的缓存必须用缓存中保存的与请求相关的最新的响应来响应请求(参见13.2.5,13.2.6和13.12节),并且满足以下条件之一:

 3. It is an appropriate 304 (Not Modified), 305 (Proxy Redirect),
    or error (4xx or 5xx) response message.

因此您可以缓存404响应消息并通知它们缓存。代理和客户端应该处理它

相关文章: