Http 如果自修改,则在浏览器中不匹配时替代

Http 如果自修改,则在浏览器中不匹配时替代,http,http-headers,browser-cache,http-caching,Http,Http Headers,Browser Cache,Http Caching,我有一个web服务器,它为特定url提供ETag。当浏览器对该url执行请求时,它会提供http头“If None Match”(如果不匹配),该头包含在服务器对该url的上一个响应中的ETag值。现在,如果我以编程方式添加请求头“if Modified Since”,并将其设置为未来或过去日期(无所谓),浏览器将停止发送“if None Match”头。我在FireFox和Chrome中都看到了这一点(没有在任何其他浏览器上进行测试)。我不能从HTTP/1.1规范中得出结论认为应该是这样。为什

我有一个web服务器,它为特定url提供ETag。当浏览器对该url执行请求时,它会提供http头“If None Match”(如果不匹配),该头包含在服务器对该url的上一个响应中的ETag值。现在,如果我以编程方式添加请求头“if Modified Since”,并将其设置为未来或过去日期(无所谓),浏览器将停止发送“if None Match”头。我在FireFox和Chrome中都看到了这一点(没有在任何其他浏览器上进行测试)。我不能从HTTP/1.1规范中得出结论认为应该是这样。为什么会发生这种情况

下面是一个简单的代码示例,将重现该场景。代码假定服务器使用Etag头进行响应

var request = new XMLHttpRequest();
request.open("GET", someUrl, true);
request.onreadystatechange = function(){};

// This statement makes the browser stop sending the "If-None-Match" header
request.setRequestHeader("If-Modified-Since", "Sat, 29 Oct 1994 19:43:31 GMT"); 

request.send(null);
现在,如果我以编程方式添加请求头“if Modified Since”,并将其设置为未来或过去日期(无所谓),浏览器将停止发送“if None Match”头

如果服务器为给定资源同时提供Etag和Last Modified标头,则它们不应:

HTTP/1.1客户端[…]如果实体标记和上次修改的值都已删除 由源服务器提供,应在中使用这两个验证器 缓存条件请求。这允许HTTP/1.0和 HTTP/1.1缓存以适当响应

编辑:在调用
XmlHttpRequest.open()
时,实现使用
nsittpchannel
准备请求,如果可以找到本地缓存项,则使用
(如果自
以来进行了修改)和
(如果没有匹配)头


现在,当您使用
If-(Un)Modified Since
调用
SetRequestHeader()
时,如果没有匹配的
,它将从请求中清除两个头并设置您的值。

您可能希望改为读取。服务器不提供上次修改的头。浏览器必须设置If-Modified-Since头的原因(实际上,只有IE需要它)是为了防止IE过于激进的缓存。在我的代码中,我将If-Modified-Since设置为当前时间,此外我还设置了“Cache-Control”:“max-age=0”。@Tore请参见编辑。正是XHR实现实现了这一点。如果您通过设置任何相关标头来覆盖内置缓存,它将删除它设置的所有缓存标头。您的意思是setRequestHeader(),而不是setResponseHeader()?