If-Modified-Since在浏览器中覆盖If-None-Match

时间:2012-10-11 07:14:18

标签: http http-headers browser-cache http-caching

我有一个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);

1 个答案:

答案 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-SinceIf-None-Match标头

现在,当您使用SetRequestHeader()If-(Un)Modified-Since拨打If-None-Match时,它会清除请求中的两个标头并设置您的值。