在PageSpeed Insights中,我一直看到消息来利用我正在使用的特定图标集/字体的浏览器缓存:iconFont.woff(2天)
我把我的.htaccess设置为:
## EXPIRES CACHING ##
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType font/ttf "access 1 week"
ExpiresByType font/woff "access 1 week"
ExpiresByType image/jpg "access 1 month"
ExpiresByType image/jpeg "access 1 month"
ExpiresByType image/gif "access 1 month"
ExpiresByType image/png "access 1 month"
ExpiresByType text/css "access 1 week"
ExpiresByType application/pdf "access 1 month"
ExpiresByType application/javascript "access 1 month"
ExpiresByType application/x-shockwave-flash "access 1 month"
ExpiresByType image/x-icon "access 1 year"
ExpiresDefault "access 2 days"
</IfModule>
## EXPIRES CACHING ##
Run Code Online (Sandbox Code Playgroud)
尽管如此,我仍然在PageSpeed Insights中收到相同的消息.如何正确缓存?
我经常在今天讨论的一个论坛,在恢复后,我发现最后两天的论坛发帖已完全回滚.
毋庸置疑,我想从论坛中找回我可以丢失的数据,我希望我至少有一些数据存储在Chrome创建的缓存文件中.
我面临两个问题 - 缓存文件没有文件类型,我不确定如何以智能方式阅读它们(尝试在Chrome中打开它们似乎以.gz格式"重新下载"它们),并且有一吨的缓存文件.
有关如何阅读和排序这些文件的任何建议?(一个简单的字符串搜索应该符合我的需要)
13.2.2启发式过期
由于源服务器并不总是提供明确的到期时间,因此HTTP缓存通常会分配启发式到期时间,采用使用其他标头值(例如Last-Modified时间)的算法来估计合理的到期时间.HTTP/1.1规范没有提供特定的算法,但确实对其结果施加了最坏情况的约束.由于启发式到期时间可能会影响语义透明度,因此应谨慎使用,我们鼓励源服务器尽可能提供明确的到期时间. HTTP/1.1 RFC 2616
浏览器使用什么算法来估算合理的到期时间?
理想的答案将涵盖所有主要浏览器,并提供源代码或官方博客文章的证据.
safari firefox internet-explorer google-chrome browser-cache
我正在使用Nginx作为网络服务器,并希望实现一种浏览器缓存方法,以便用户在本地保存静态未更改文件的副本,并仅下载已更改的文件.其中一个建议是使用文件时间戳来找出已更改的文件并仅刷新它们,但在我的情况下这是不可能的,因为在每次新部署之后都会创建整个Web应用程序的新版本以及所有文件的时间戳更改.
我研究了一下ETag标题,它似乎是一个非常好的解决方案,但我发现Etags尚未得到Nginx的正式支持.
有没有办法在Nginx上实现Etags或任何替代解决方案?
我正在尝试正确设置缓存并将Expires标头设置为将来365天正常工作但未在IE9中正确显示.有谁知道为什么?
当您访问IE9中的任何网站(例如www.google.com),然后在地址栏中单击Enter以使用完全缓存重新访问它,它显示了Fiddler未显示的许多额外304.
查看网络检查器选项卡(在F12上),IE9显示它已收到针对CSS和JS文件的304 Not Modified响应和3个图像(可能是大约在过去一个月内修改日期的图像 - 其他30个未显示的图像较旧).
但是,根据Fiddler并在我正在开发的网站上查看服务器上的IIS日志,它实际上并没有提出这些请求.IE9网络时间线显示这些灰色302s没有等待时间和"<1 ms"响应时间 - 而如果我按F5它们也是灰色302s,但显示等待和下载时间几毫秒(并且它们命中网络).
那么为什么IE9网络检查员认为它发布了这些条件请求呢?在它到达Fiddler之前,它是否实际发出了某个网络堆栈满足的请求?
Chrome会将所有请求(包括所有图片)显示为灰色200(来自缓存),而不是页面本身(黑色200)(根据Fiddler和IIS日志,这是正确的).
Firebug为CSS和JS显示灰色200 OK,奇怪的是只有一个图像(也正确,假设灰色200表示来自缓存 - 但为什么只显示这些资源而不是所有其他图像?)
我一直在阅读Eric Lawrence关于IE9缓存和网络堆栈的博文,但他没有提到这种奇怪的行为.
我需要使用JavaScript重新加载页面,并确保它不会从浏览器缓存中提取,而是从服务器重新加载页面.[由于页面元素在过渡期间会发生变化]
在IE和FF上,我发现以下代码工作正常;
window.location.reload(true);
Run Code Online (Sandbox Code Playgroud)
但是它不适用于Chrome或Safari.
我试过以下,但也无济于事;
window.location.replace(location.href);
document.location.reload(true);
document.location.replace(location.href);
Run Code Online (Sandbox Code Playgroud)
这个问题有解决方案吗?
发现
在调查之后我发现这个问题是HTTP协议处理;
Pragma: no-cacheHTTP字段发送请求Last-Modified: DATE1字段location.reload(true)强制从服务器重新加载而不是缓存If-Modified-Since: DATE1字段发送请求HTTP Status 304 Not Modified服务器应用程序因未注意到动态页面内容中的状态更改而出错,因此不返回a 200.但是,Chrome/WebKit是唯一一个If-Modified-Since在location.reload(true)调用JS时发送字段的浏览器.
我想我会把我的发现放在这里以防其他人遇到同样的问题.
ES6模块允许我们创建一个单一的入口点,如下所示:
// main.js
import foo from 'foo';
foo()Run Code Online (Sandbox Code Playgroud)
<script src="scripts/main.js" type="module"></script>Run Code Online (Sandbox Code Playgroud)
foo.js将存储在浏览器缓存中.在我将新版本的foo.js推向生产之前,这是可取的.
通常的做法是添加一个具有唯一ID的查询字符串参数,以强制浏览器获取新版本的js文件(foo.js?cb = 1234)
如何使用es6模块模式实现这一目标?
我知道这是stackoverflow中的一个流行问题.我已经经历了每一个相同的问题,我无法为我找到正确的答案.这是我的注销控制器动作结果
[Authorize]
public ActionResult LogOut(User filterContext)
{
Session.Clear();
Session.Abandon();
Session.RemoveAll();
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
Response.Cache.SetNoStore();
FormsAuthentication.SignOut();
return RedirectToAction("Home", true);
}
Run Code Online (Sandbox Code Playgroud)
它对我不起作用.我也尝试添加 -
<meta http-equiv="Cache-Control" content="no-cache" />
<meta http-equiv="Pragma" content="no-cache"/>
<meta http-equiv="Expires" content="0"/>
这些都没有解决我的问题.
在Webpack之前,我总是依赖于以下模式来进行"缓存清除":
<script src="foo.js?cacheBust=12345" />
Run Code Online (Sandbox Code Playgroud)
哪个12345是服务器在每个构建时为我生成的标记(它可能是Git哈希,尽管在我的情况下它不是).
有了Webpack,我现在有两个文件:build.js和chunk.1.js.由于我使用正常的脚本标记带来第一个,我可以使用上面的模式:
<script src="build.js?cacheBust=12345" />
Run Code Online (Sandbox Code Playgroud)
但是,此时build.js会进行提取chunk.1.js,并且当它执行时,它不包括缓存无效的后缀.
我想让Webpack自动附加?cacheBust=12345,但我不知道12345构建时的部分,所以我不能把它包含在我的webpack.config.相反,我必须等到HTML页面被评估,此时我从服务器获取令牌.
所以,我的问题是,有没有办法让Webpack查看用于获取初始文件的参数(例如.?cacheBust=12345)并在获取其他文件时附加相同的参数?
browser-cache ×10
javascript ×2
safari ×2
asp.net-mvc ×1
c# ×1
caching ×1
es6-modules ×1
etag ×1
fiddler ×1
firefox ×1
http ×1
nginx ×1
web ×1
webkit ×1
webpack ×1
woff ×1