14

如何说服 Firefox(3.0.1,如果重要)在 HTTPS 请求中发送 If-Modified-Since 标头?如果请求使用纯 HTTP 并且我的服务器尽职尽责地尊重它,它会发送标头。但是,当我使用 HTTPS 从同一服务器请求相同的资源时(即,只需将 URL 中的 http:// 更改为 https://),Firefox 根本不会发送 If-Modified-Since 标头。这种行为是 SSL 规范规定的还是什么?

以下是一些示例 HTTP 和 HTTPS 请求/响应对,使用 Live HTTP Headers Firefox 扩展提取,其中一些差异以粗体显示:

HTTP 请求/响应:

http://myserver.com:30000/scripts/site.js

获取 /scripts/site.js HTTP/1.1
主机:myserver.com:30000
用户代理:Mozilla/5.0 (...) Gecko/2008070206 Firefox/3.0.1
接受:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
接受语言:en-us,en;q=0.5
接受编码:gzip,deflate
接受字符集:ISO-8859-1,utf-8;q=0.7,*;q=0.7
保活:300
连接:保持活动
If-Modified-Since: 2008 年 8 月 19 日星期二 15:57:30 GMT
如果-无匹配:“a0501d1-300a-454d22526ae80”-gzip
缓存控制:max-age=0

HTTP/1.x 304 未修改
日期:格林威治标准时间 2008 年 8 月 19 日星期二 15:59:23
服务器:Apache/2.2.8 (Unix) mod_ssl/2.2.8 OpenSSL/0.9.8
连接:保持活动
保活:超时=5,最大值=99
Etag:“a0501d1-300a-454d22526ae80”-gzip

HTTPS 请求/响应:

https://myserver.com:30001/scripts/site.js

获取 /scripts/site.js HTTP/1.1
主机:myserver.com:30001
用户代理:Mozilla/5.0 (...) Gecko/2008070206 Firefox/3.0.1
接受:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
接受语言:en-us,en;q=0.5
接受编码:gzip,deflate
接受字符集:ISO-8859-1,utf-8;q=0.7,*;q=0.7
保活:300
连接:保持活动

HTTP/1.x 200 正常
日期:格林威治标准时间 2008 年 8 月 19 日星期二 16:00:14
服务器:Apache/2.2.8 (Unix) mod_ssl/2.2.8 OpenSSL/0.9.8
最后修改时间:2008 年 8 月 19 日星期二 15:57:30 GMT
Etag:“a0501d1-300a-454d22526ae80”-gzip
接受范围:字节
内容编码:gzip
内容长度:3766
保活:超时=5,最大值=100
连接:保持活动
内容类型:文本/javascript

更新:设置browser.cache.disk_cache_ssl为 true 就可以了(这很奇怪,因为正如 Nickolay 指出的那样,内存缓存仍然存在)。在响应中添加“缓存控制:公共”标头也有效。谢谢!

4

2 回答 2

14

HTTPS 请求不会被缓存,因此发送 If-Modified-Since 没有任何意义。不缓存是一种安全预防措施。

不在磁盘上缓存是一种安全预防措施,但它似乎确实影响了If-Modified-Since行为(浏览代码)。

尝试将 Firefox 首选项(在 about:config 中)browser.cache.disk_cache_ssl设置为true。如果这有帮助,请尝试在响应中发送Cache-Control: public标头。


更新: Gecko 2.0 (Firefox 4) 的Firefox 行为已更改——HTTPS 内容现在被缓存。

于 2008-08-19T16:51:42.157 回答
2

HTTPS 请求不会被缓存,因此发送If-Modified-Since没有任何意义。不缓存是一种安全预防措施。

于 2008-08-19T16:12:00.897 回答