2011-07-09 28 views
5

我们正在努力减少一些“毫无意义”的流量。用404响应发送cache-control/expires/pragma - 现代浏览器有效/理解吗?

如果我们用404响应发送有效的缓存控制头(a-la“do cache”),现代浏览器会缓存请求的资源不存在吗?

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

这些是公共资源btw由所有用户访问相同的uri。

谢谢!

+1

请为您设置的缓存标题以及如何命名。 – hakre

回答

10

现代浏览器的HTTP Protocol的实现接近标准,对于代理服务器也是如此,如果您希望对用户和非故意的僵尸网络流量产生影响,您应该考虑这些代理服务器。目前version is 1.1,一些摘录:4XX

的4XX类的状态代码是用于在客户端似乎有错误的情况下

10.4客户端错误。除了响应HEAD请求之外,服务器应该包含一个包含错误情况说明的实体,以及它是临时还是永久性条件。这些状态码适用于任何请求方法。用户代理应该向用户显示任何包含的实体。

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

更具体地为404:

10.4.5 404未找到

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

对于404响应代码非常重要。

你问:

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

您还没有给出任何您想使用的特定缓存标头,因此回答您的问题有点不庄重。缓存是协议规范中的一部分:13 Caching in HTTP

大致有如下应你在找什么,摘自13.1.1 Cache Correctness

正确的缓存必须与通过适当的缓存中保存最先进的最新响应的请求作出回应于该请求(见章节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响应消息并将其发送给缓存。代理和客户端应该处理它。

+0

是啊,这实际上使很多道理......我们最终会做的是a)如果没有if-modified-since头,发送缓存头+自定义404页面,b)如果是如果修改 - 自头,发送304没有修改身体代码W/O正文。谢谢。 –

+2

@ anonymous-one:那么这会给你头部往返404脚本的PHP脚本,因为它仍然会被调用,所以没有任何意义。如果您真的确定该资源无效,请允许缓存几天,并且不要执行“自修改后”之类的任何操作。只要让它缓存起来。如果您可以识别用户实际正在查找的资源,则可以使用410 Gone代替,或者将302与位置标题和新位置一起移动,这样您就可以在搜索引擎和外部资源中保持链接。让这个响应缓存几天。 – hakre

相关问题