我是一名Web开发人员,曾与PHP和.NET合作过.有超过一年的网络工作经验,我无法彻底了解浏览器缓存功能,我希望网络大师可以帮助我.我心中的疑问是:
将ETag添加到HTTP响应时,是否应该包含媒体类型?当然,我知道ETag是不透明的,但这是一个例子:
显然,简单地返回304是不正确的,但我的问题是,在第二个请求中,我希望ETag匹配但是没有基于Accept标头(或内容标头)的缓存.此外,是否有可能缓存将具有来自同一URI的两个表示,或者每次切换Content-Type时是否总是会有无效缓存?
我希望在渲染之前获取视图任何部分的最后修改时间.这包括布局页面,部分视图等.
我想为自己设定一个合适的时间
Response.Cache.SetLastModified(viewLastWriteUtcTime);
Run Code Online (Sandbox Code Playgroud)
正确处理http缓存.目前我有这个工作用于视图本身,但是如果布局页面有任何更改,或子视图部分视图没有被选中
var viewLastWriteUtcTime = System.IO.File.GetLastWriteTime(
Server.MapPath(
(ViewEngines.Engines.FindView(ControllerContext, ViewBag.HttpMethod, null)
.View as BuildManagerCompiledView)
.ViewPath)).ToUniversalTime();
Run Code Online (Sandbox Code Playgroud)
有什么方法可以获得整个上次修改时间吗?
304 Not Modified在修改视图的相关部分的部署之后,我不想回应,因为用户会得到不一致的行为.
我对这个片段很感兴趣:
public function indexAction()
{
$response = $this->render('MyBundle:Main:index.html.twig');
$response->setETag(md5($response->getContent()));
$response->isNotModified($this->getRequest());
return $response;
}
Run Code Online (Sandbox Code Playgroud)
我应该尽可能这样做吗?我认为我的网站中的大多数页面都可以通过这种方式节省带宽(尽管不是CPU).
我在使用Microsoft的MVC3框架中的OutputCache属性时遇到了问题.
请设想以下控制器操作,该操作可用作AJAX调用的一部分,以获取基于特定manufacturerId的产品列表:
public JsonResult GetProducts(long manufacturerId)
{
return Json(this.CreateProductList(manufacturerId), JsonRequestBehavior.AllowGet);
}
Run Code Online (Sandbox Code Playgroud)
我希望将此结果缓存在服务器上,以避免进行过多的数据库查询.我可以通过配置属性来实现这一点:
[OutputCache(Duration = 3600, Location = OutputCacheLocation.Server, VaryByParam = "manufacturerId")]
Run Code Online (Sandbox Code Playgroud)
这符合我的预期 - 浏览器发出一个初始请求,导致服务器创建并缓存结果,来自相同或不同浏览器的后续请求获得缓存版本.
但是......我也希望浏览器在本地缓存这些结果; 如果我先在制造商X上过滤,然后Y再回到X,我不希望它再向X的产品发出请求 - 我希望它只使用它的缓存版本.
通过将OutputCache更改为:我可以实现这一点:
[OutputCache(Duration = 3600, Location = OutputCacheLocation.Client)]
Run Code Online (Sandbox Code Playgroud)
这是一个问题:如何将这些组合起来以便我可以拥有这两组行为?我尝试将Location设置为ServerAndClient但这只是使它的行为与Location is Server时的行为相同.
我确定这个问题与我在ServerAndClient上获得的"Vary:*"响应头有关,但我不知道如何摆脱它.
我欢迎评论我的意图的合理性 - 事实上我没有得到我期望的结果让我觉得我可能在某处有一些根本的误解......
非常感谢.
PS:这是在本地开发环境,VS2010的IIS Express.
我知道这个问题有好几次了.但我仍然不清楚这个概念.在SO中阅读了很多博客和答案后,我得到的是,
Expiry headers are used when you don’t even want client (and proxies/caches) to make a request to
the server. In ETAG, the client will check with the server for the update, but in expiry
headers, the client will know, when to expire the file and check for an update, till then it
(browsers and proxies/caches) won’t bother server for checking the update.
Run Code Online (Sandbox Code Playgroud)
所以基本上它说如果我们使用expires/max-age标头,它甚至不会检查服务器是否有更新的文件.所以我想在本地进行测试.
所以我创建了简单的html文件,包括2个js文件和1个图像文件.在IIS中,我已将图像文件夹的Expires标头设置为2天.因此,根据我的理解,在从服务器获取图像文件一次后,对于下一个请求,它不应该向服务器发送请求以检查图像文件是否被修改.
但我得到的是每次刷新页面时,我看到发送到服务器的请求,服务器返回304 not modified状态.但根据我阅读的规格/博客它不应该向服务器发送请求.
有人请解释一下.
我构建了一个服务工作者,它总是用来自缓存的数据进行响应,然后在后台向服务器发送请求。如果服务器响应HTTP 304 - not modified一切正常,如果服务器响应HTTP 200,则意味着数据已更改并将新文件放入缓存中,同时通知用户并要求刷新页面。
我使用not-modified-since/last-modified标头来确保客户端获得最新版本。当通过请求发送fetch()请求时,它会在其通往网络的路上传递 HTTP 缓存 - 响应到达客户端时也会传递 HTTP 缓存。问题是当响应具有状态时304- 未修改 HTTP 缓存使用缓存版本响应服务工作者并将状态替换为200(如获取规范中所述 - HTTP-network-or-cache-fetch)。在 Service Worker 中,无法确定200响应最初是由服务器发送的(用户需要更新)还是由缓存发送并且服务器最初响应为304 (已经加载了最新版本)。
有可以设置为的缓存模式标志no-cache,但是当请求发送到服务器时,这也会绕过 HTTP 缓存,这意味着if-modified-since未设置标头并且服务器没有机会找出哪个版本客户有。此外,此标志目前仅由 Firefox 每晚支持。
我认为最好的解决方案是设置一个自定义的 HTTP 标头,就像x-was-modified服务器以200. 可以在 service worker 中访问此自定义标头,并可用于确定资源是否已更新 - 即使 HTTP 缓存将304状态替换为200.
x-if-modified-since …caching http http-caching http-status-code-304 service-worker
我试图尽快使页面速度.问题是我有一个文件特别需要很长时间才能下载(即使大小为0 - >从缓存加载)
以下是没有缓存(第一次加载)时的外观:
并使用缓存:
我同意时间减少了近50%,但为什么我的本地缓存中的内容下载时间高于服务器上的时间?
注意:
我不确定Safari中的时间是否相同,但是在那里获取文件并不需要那么长时间.
来自Safari网络标签的图片:
Cloudflare 记录了Cache-Control标头的指令列表,包括stale-while-revalidate。
- stale-while-revalidate=<seconds>
当出现在 HTTP 响应中时,stale-while-revalidate Cache-Control 扩展指示缓存可以服务它在它变得陈旧后出现的响应,最多指示的秒数该对象最初被检索。
我将Cache-Control标头设置为,public, max-age=0, stale-while-revalidate=30但似乎从未命中缓存。Cloudflare 真的支持这个吗?
我在几个生产网站中禁用了 Service Worker,当我使用 Chrome devtools(网络选项卡)调试时,我可以看到使用 HTTP 缓存(来自磁盘缓存和来自内存缓存)的资源加载时间比使用 ServiceWorker(来自 serviceworker)要好。
我完全同意服务工作者可以更好地控制缓存管理和离线用例。
Service Worker 比 HTTP 缓存还有什么其他好处?
http-caching ×10
caching ×5
http ×3
cloudflare ×1
etag ×1
http-headers ×1
javascript ×1
php ×1
razor ×1
rest ×1
symfony ×1
view ×1