5

我有一个为特定 URL 提供 ETag 的 Web 服务器。当浏览器对该 url 执行请求时,它会向 http-header “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);
4

1 回答 1

4

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

如果服务器在给定资源的 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-Sinceor调用时If-None-Match,它将清除请求中的两个标头并设置您的值。

于 2012-12-11T11:47:39.670 回答