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

Tor*_*ore 5 http http-caching browser-cache http-headers

我有一个Web服务器,为特定的URL提供ETag.当浏览器执行对此URL的请求时,它提供http-header"If-None-Match",其中包含来自服务器的该URL的先前响应中包含的ETag值.现在,如果我编程添加请求头"如果-Modified-Since的"并将其设置为一个或者是将来或过去的日期(无所谓),浏览器停止发送"如果 - 无 - 匹配" -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);
Run Code Online (Sandbox Code Playgroud)

Cod*_*ter 4

现在,如果我以编程方式添加请求标头“If-Modified-Since”并将其设置为未来或过去的日期(无关紧要),浏览器将停止发送“If-None-Match”标头。

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

HTTP/1.1 客户端 [...] 如果源服务器已提供实体标记和 Last-Modified 值,则应该在缓存条件请求中使用这两个验证器。这允许 HTTP/1.0 和 HTTP/1.1 缓存做出适当的响应。

编辑:调用 时,如果可以找到本地缓存项,实现会使用 、和标头来XmlHttpRequest.open()准备请求。nsIHttpChannelIf-Modified-SinceIf-None-Match

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