Http 如果自修改,则在浏览器中不匹配时替代
我有一个web服务器,它为特定url提供ETag。当浏览器对该url执行请求时,它会提供http头“If None Match”(如果不匹配),该头包含在服务器对该url的上一个响应中的ETag值。现在,如果我以编程方式添加请求头“if Modified Since”,并将其设置为未来或过去日期(无所谓),浏览器将停止发送“if None Match”头。我在FireFox和Chrome中都看到了这一点(没有在任何其他浏览器上进行测试)。我不能从HTTP/1.1规范中得出结论认为应该是这样。为什么会发生这种情况 下面是一个简单的代码示例,将重现该场景。代码假定服务器使用Etag头进行响应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规范中得出结论认为应该是这样。为什
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()?