我有一个Web服务器,它为特定网址提供ETag。当浏览器执行对此URL的请求时,它提供http-header“If-None-Match”,其中包含来自服务器的该URL的先前响应中包含的ETag值。现在,如果我以编程方式添加请求标头“If-Modified-Since”并将其设置为将来或过去的日期(无关紧要),浏览器将停止发送“If-None-Match”-header。我在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);
答案 0 :(得分:4)
现在,如果我以编程方式添加请求标头“If-Modified-Since”并将其设置为将来或过去的日期(无关紧要),浏览器将停止发送“If-None-Match” -header。
如果服务器同时提供给定资源的Etag和Last-Modified标头,则不应该这样做:
HTTP / 1.1客户端[...]如果实体标记和Last-Modified值都已存在 由原始服务器提供,应该使用两个验证器 缓存条件请求。这允许HTTP / 1.0和 HTTP / 1.1缓存可以做出适当的响应。
编辑:在调用XmlHttpRequest.open()
时,该实现使用nsIHttpChannel
准备请求,如果它可以找到本地缓存项目,则使用If-Modified-Since
和If-None-Match
标头
现在,当您使用SetRequestHeader()
或If-(Un)Modified-Since
拨打If-None-Match
时,它会清除请求中的两个标头并设置您的值。