Internet explorer 我不尊重他

Internet explorer 我不尊重他,internet-explorer,browser-cache,cache-control,expires-header,if-modified-since,Internet Explorer,Browser Cache,Cache Control,Expires Header,If Modified Since,IE(7-10)似乎不尊重过期信息。我打开小提琴手,正在检查。如果响应有一个etag,那么它将执行一个304,否则它将对在未来1年到期的资源执行一个200。我也试着设置最后一次修改。它似乎不起作用。 在chrome中,当有一个expires标签时,它甚至不会进入服务器(对于304),而是缓存了它。 下面是一些Fiddler标题 Req Headers GET /geoip/city?country=US&state=ID HTTP/1.1 X-Requested-With: XMLHtt

IE(7-10)似乎不尊重过期信息。我打开小提琴手,正在检查。如果响应有一个etag,那么它将执行一个304,否则它将对在未来1年到期的资源执行一个200。我也试着设置最后一次修改。它似乎不起作用。 在chrome中,当有一个expires标签时,它甚至不会进入服务器(对于304),而是缓存了它。 下面是一些Fiddler标题

Req Headers
GET /geoip/city?country=US&state=ID HTTP/1.1
X-Requested-With: XMLHttpRequest
Accept: */*
Referer: http://localhost/register/BG/57ac5960-f0d5-11e3-90d1-af2b2634c624
Accept-Language: en-US
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
Connection: Keep-Alive
Host: localhost
Cookie: connect.sid=s%3AntN3Tq9zXgrnlo5YOR1bsSa0lHE987Nv.aBbljhmG5tpfYcIXMgonxnhhWaWwd%2BTQ4jIKLnqL4us

Response Headers
HTTP/1.1 200 OK
X-Powered-By: Express
Vary: X-HTTP-Method-Override, Accept-Encoding
expires: Sun Jul 05 2015 23:15:21 GMT-0400 (Eastern Daylight Time)
Content-Type: application/json; charset=utf-8
Content-Encoding: gzip
Date: Mon, 07 Jul 2014 03:15:21 GMT
Connection: keep-alive
Transfer-Encoding: chunked
还有电子标签

req Headers
GET /geoip/city?country=US&state=ID HTTP/1.1
X-Requested-With: XMLHttpRequest
Accept: */*
Referer: http://localhost/register/BG/57ac5960-f0d5-11e3-90d1-af2b2634c624
Accept-Language: en-US
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
Host: localhost
If-None-Match: W/"101c-2996882950"
Connection: Keep-Alive
Cookie: connect.sid=s%3AntN3Tq9zXgrnlo5YOR1bsSa0lHE987Nv.aBbljhmG5tpfYcIXMgonxnhhWaWwd%2BTQ4jIKLnqL4us

Response header
HTTP/1.1 304 Not Modified
X-Powered-By: Express
Vary: X-HTTP-Method-Override
expires: Sun Jul 05 2015 23:18:47 GMT-0400 (Eastern Daylight Time)
ETag: W/"101c-2996882950"
Date: Mon, 07 Jul 2014 03:18:48 GMT
Connection: keep-alive
根据鲁德的建议,以下是请求/回复

GET /geoip/city?country=US&state=MO HTTP/1.1
Cache-Control: public, max-age=31536000
Accept: */*
X-Requested-With: XMLHttpRequest
Referer: http://localhost/register/BG/57ac5960-f0d5-11e3-90d1-af2b2634c624
Accept-Language: en-US
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
Connection: Keep-Alive
If-None-Match: W/"3bf9-3115988671"
Host: localhost
Cookie: connect.sid=s%3AZvwd9g7PAbQl7QHVx0ucpBMNnELll1R_.6KIvAtRWv9FK3zxxXVZfJBCpSv962zxLeTkvGd7mQq8

HTTP/1.1 304 Not Modified
X-Powered-By: Express
Vary: X-HTTP-Method-Override
expires: Mon Jul 06 2015 08:37:49 GMT-0400 (Eastern Daylight Time)
Cache-Control: public, max-age=31536000
last-modified: Sat Jul 07 2012 08:37:49 GMT-0400 (Eastern Daylight Time)
ETag: W/"3bf9-3115988671"
Date: Mon, 07 Jul 2014 12:37:49 GMT
Connection: keep-alive

您的HTTP请求不包含
(如果自
头修改)。这通常意味着页面尚未缓存。这可能是由于缺少
缓存控制
头。如果没有该标头,web浏览器可能会应用自己的默认缓存行为。在IE7/8/9/10的例子中,这很可能是这样的:“您的URL有一个查询字符串,我们不要缓存它。”

请尝试将此标头添加到HTTP请求:

Cache-Control: public, max-age=31536000
您的HTTP请求包含
X-request-With:XMLHttpRequest
,因此我假设您正在使用XMLHttpRequest向web服务器发送HTTP请求。您可能可以这样添加标题:

req.setRequestHeader("Cache-Control", "public, max-age=31536000");
除上述内容外,您可能需要在HTTP响应中有一个
Last Modified
头;如果在下一个HTTP请求时修改了自
头,客户端可能需要此日期/时间来输入

使用Fiddler验证:

  • HTTP请求包含头
    缓存控制
  • HTTP响应包含上次修改的头
  • 第二次,HTTP请求同时包含
    缓存控制
    (如果自

当所有其他都失败时,您甚至可以考虑将自己的<代码>如果修改为头,进入HTTP请求。


上述标题的文件可在第14.9节、第14.25节和第14.29节中找到。一种可能的解释是:

Expires: Sun Jul 05 2015 23:15:21 GMT-0400 (Eastern Daylight Time)
不是有效的RFC 1123日期。尝试将响应标头字段更改为:

Expires: Sun, 05 Jul 2015 23:15:21 GMT
国家:

HTTP/1.1客户端和缓存必须像过去一样处理其他无效的日期格式,特别是包括值“0”(即“已过期”)

在此基础上,web浏览器的行为取决于是否存在上次修改的
和/或
ETag
响应标题字段

  • 没有上次修改的
    /
    ETag
    :由于
    过期
    的日期无效,并且没有可依赖的
    缓存控件
    (您确实测试了
    缓存控件
    ,但使用上次修改的
    /
    ETag
    ,而不是没有),缓存可能会被禁用;客户端将发送一个请求,服务器将以200的响应
  • 使用
    Last Modified
    /
    ETag
    :可以启用缓存,但
    Expires
    的日期无效,因此客户端被迫发送请求以验证缓存是否过期。服务器以304响应以确认缓存是否正常
从你的故事中,我推测这正是IE7-10所做的

另一方面,请注意:

鼓励日期值的收件人在接受可能由非HTTP应用程序发送的日期值时保持稳健,有时通过代理/网关检索或发布邮件到SMTP或NNTP时也是如此

因此,一些浏览器可能比其他浏览器更自由,并尽最大努力解析您的日期(似乎正是这一点)。这或许可以解释为什么IE没有命中Chrome缓存

注意:您可以考虑将“代码>缓存控制:公共,最大年龄=31536000 /代码>添加到响应头中,除了(或作为替换)<代码>过期< /代码>。另见:


编辑: 我用IE9做了一个非常简单的测试。在Linux机器上,我反复运行以下命令(使其充当单点web服务器):

这是我的
h1.txt
;因为我是在Linux机器上创建的,所以我必须使用
unix2dos
来确保每一行都以
\r\n
终止。相关的响应标题字段为
Expires
Last Modified

HTTP/1.1 200 OK
Content-Type: text/html;charset=utf-8
Date: Sat, 12 Jul 2014 20:07:43 GMT
Expires: Sun, 05 Jul 2015 23:15:21 GMT
Last-Modified: Sat, 12 Jul 2013 20:07:43 GMT
Server: WEBrick/1.3.1 (Ruby/1.9.2/2014-01-23)
Content-Length: 252
Connection: keep-alive
b1.txt
是一个HTML页面,其中一段JavaScript调用
XMLHttpRequest
,向同一页面发送HTTP请求(因为我懒得设置另一个页面)


试验
发送请求
函数SendReq(){
var rq=新的XMLHttpRequest();
rq.open('GET','http://192.168.1.103:91/",对),;
rq.send();
}
我没有安装小提琴手;我改为使用Wireshark(在
tcp.port==91上进行过滤)来监控流量。事实上,在清除IE9缓存之前,我可以随时点击网页上的按钮,没有流量

这意味着IE9的缓存工作正常;问题必须在web服务器上;更具体地说,在响应头中。任何小错误都可能破坏缓存。您原来的Expires头字段(带有非GMT日期)就是一个很好的例子


正如Pierre所指出的,一定要将
Last Modified
和/或
ETag
放在响应头中,否则即使页面存在于缓存中,IE也可能往返于web服务器。但我怀疑每一款网络浏览器都是如此,而不仅仅是传统IE。

我想你还不了解Expires的用途。它只是告诉浏览器:“将其保存在缓存中,直到…”但它没有告诉:“并且不要检查它是否未被修改”! 因此,使用“Expires”和“Last modified”,同时使用两个正确的(有效的RFC 1123)日期值:“Sun,2015年7月5日23:15:21 GMT”。
它应该可以工作。

您能指出您发送的确切标题吗?我不认为这么大的错误会被忽略。还要注意的是,如果你是通过点击链接来导航你的页面,那么这种行为应该被忽略
HTTP/1.1 200 OK
Content-Type: text/html;charset=utf-8
Date: Sat, 12 Jul 2014 20:07:43 GMT
Expires: Sun, 05 Jul 2015 23:15:21 GMT
Last-Modified: Sat, 12 Jul 2013 20:07:43 GMT
Server: WEBrick/1.3.1 (Ruby/1.9.2/2014-01-23)
Content-Length: 252
Connection: keep-alive
<html>
<head>
<title>Test</title>
</head>
<body>
<button onclick="SendReq()">Send request</button>
<script>
function SendReq() {
    var rq = new XMLHttpRequest();
    rq.open('GET', 'http://192.168.1.103:91/', true);
    rq.send();
}
</script>
</body>
</html>