标签: http-caching

浏览器如何使用过期标头,缓存控制标头,最后修改标头?

我是一名Web开发人员,曾与PHP和.NET合作过.有超过一年的网络工作经验,我无法彻底了解浏览器缓存功能,我希望网络大师可以帮助我.我心中的疑问是:

  • 浏览器如何实际缓存内容,它是否请求查看服务器上的缓存文件是否已更改,
  • 开发人员充分利用浏览器缓存的理想方式是什么,同时也能够毫不费力地在网站上推送新的更改.我认为如果浏览器以某种方式缓存我的CSS和JS和图像,然后每次只检查它们对服务器的修改,这可以解决问题.但我不知道该怎么做.

http-caching browser-cache

6
推荐指数
1
解决办法
8728
查看次数

我应该在我的ETag中包含媒体类型吗?

将ETag添加到HTTP响应时,是否应该包含媒体类型?当然,我知道ETag是不透明的,但这是一个例子:

  • 假设我有一个客户端在application/json中请求一个Person.我查阅并创建我的ETag并发回该人的JSON表示
  • 现在,同一个客户端在同一个URI上对同一个人(尚未修改)发出另一个请求,但希望它在application/xml中.

显然,简单地返回304是不正确的,但我的问题是,在第二个请求中,我希望ETag匹配但是没有基于Accept标头(或内容标头)的缓存.此外,是否有可能缓存将具有来自同一URI的两个表示,或者每次切换Content-Type时是否总是会有无效缓存?

rest http http-caching http-headers

6
推荐指数
1
解决办法
357
查看次数

ASP.NET MVC3获取上次修改时间的任何部分视图?

我希望在渲染之前获取视图任何部分的最后修改时间.这包括布局页面,部分视图等.

我想为自己设定一个合适的时间

 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在修改视图的相关部分的部署之后,我不想回应,因为用户会得到不一致的行为.

view last-modified http-caching razor asp.net-mvc-3

6
推荐指数
1
解决办法
1014
查看次数

我应该检查大多数回复是否"未修改"?

我对这个片段很感兴趣:

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).

php caching http-caching symfony

6
推荐指数
1
解决办法
168
查看次数

MVC3 OutputCache无法按预期在Server和Client上运行

我在使用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.

http-caching asp.net-mvc-3

6
推荐指数
1
解决办法
6329
查看次数

Etag和Expires标头有什么区别?

我知道这个问题有好几次了.但我仍然不清楚这个概念.在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状态.但根据我阅读的规格/博客它不应该向服务器发送请求.

有人请解释一下.

在此输入图像描述

etag http cache-control http-caching browser-cache

6
推荐指数
1
解决办法
1640
查看次数

在 service worker / fetch() 中识别 HTTP 304

我构建了一个服务工作者,它总是用来自缓存的数据进行响应,然后在后台向服务器发送请求。如果服务器响应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.

  • 这是一个合法的解决方案/解决方法吗?是否有任何建议的方法来解决这个问题?
  • 在实现 Service Worker 缓存时,我是否应该依赖处理 HTTP 缓存的 HTTP 标头?或者我应该使用自定义x-if-modified-since …

caching http http-caching http-status-code-304 service-worker

6
推荐指数
1
解决办法
4460
查看次数

为什么chrome Content Download需要更长时间才能获得缓存资源?

我试图尽快使页面速度.问题是我有一个文件特别需要很长时间才能下载(即使大小为0 - >从缓存加载)

以下是没有缓存(第一次加载)时的外观:

没有缓存

并使用缓存:

有缓存

我同意时间减少了近50%,但为什么我的本地缓存中的内容下载时间高于服务器上的时间?

注意:

我不确定Safari中的时间是否相同,但是在那里获取文件并不需要那么长时间.

来自Safari网络标签的图片:

在此输入图像描述

caching google-chrome http-caching browser-cache

6
推荐指数
1
解决办法
637
查看次数

Cloudflare 是否支持 stale-while-revalidate?

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 真的支持这个吗?

caching http-caching cloudflare

6
推荐指数
1
解决办法
525
查看次数

Service Worker 缓存与 HTTP 缓存

我在几个生产网站中禁用了 Service Worker,当我使用 Chrome devtools(网络选项卡)调试时,我可以看到使用 HTTP 缓存(来自磁盘缓存和来自内存缓存)的资源加载时间比使用 ServiceWorker(来自 serviceworker)要好。

我完全同意服务工作者可以更好地控制缓存管理和离线用例。

Service Worker 比 HTTP 缓存还有什么其他好处?

javascript caching http-caching service-worker

6
推荐指数
1
解决办法
963
查看次数