堆栈的尊重溢出,HTTP缓存,浏览器差异
所以我最近一直试图围绕HTTP资源缓存完全包装我的头。值得注意的是,现在我正在查看一个简单的缓存图像,该图像用于在页面中呈现图标/小图片。下面是我看到的奇怪行为的解释:
因此,在给定的页面上,我只有一个图像:icons.sprite.gif。有四个元素使用精灵在页面上显示各种图标。在我的Apache配置,我已经安装了指定mod_expires和以下缓存控制指令:
ExpiresActive On
ExpiresDefault "access plus 300 seconds"
ExpiresByType text/html "access plus 1 day"
ExpiresByType text/css "access plus 1 day"
ExpiresByType text/javascript "access plus 1 day"
ExpiresByType image/gif "access plus 1 week"
ExpiresByType image/jpg "access plus 1 week"
ExpiresByType image/png "access plus 1 week"
ExpiresByType application/x-shockwave-flash "access plus 1 day"
现在,这里的怪事。在Safari中,当我加载页面时,net-inspector只显示一个精灵的请求。这是完美的,按预期工作。另一方面,在Internet Explorer和Firefox中,Fidder/Firebug揭示了四个成功的sprill图像请求=什么!?随后的请求导致单个缓存命中,但是第一个加载包含四个并发请求。这似乎是一个相当大的wtf,因为它似乎绕过了整个spriting的重点,这是为了减少给定页面加载周期中资源请求的数量。
什么可能会发生:
的页面加载速度不够快的时候第二个元素呈现于使用拼合背景图片文件,对于精灵的第一个请求尚未完成。因此,如果资源尚未被缓存,随着后续元素的渲染,它们会导致对资源的新请求,即使它已被加载。 Safari以某种方式处理并防止这种情况(我知道Safari的缓存实践与其他浏览器有所不同)。
所以 - 我在这里寻找一些确认/输入。这些浏览器是否“按预期工作” - 此外,它否定了与spriting相关的性能收益(这会引入css维护复杂性)?或者,我在做什么错了?
我很欣赏你的想法/建议。
干杯,
Skone