问题标签 [http-caching]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
webkit - 当同时提供 max-age 和 Last-Modified 标头时,Webkit 不缓存
我有一个使用自定义 Web 服务器编写一个基于 Web 的应用程序,我遇到了 Webkit 浏览器不缓存图像、样式表和 javascript 的问题。
我已经将其归结为 Cache-Control: max-age 和 Last-Modified 之间的某种关系。如果两者都指定了,那么 webkit 似乎会忽略 max-age 标头,并在每次使用资源时检查文件是否已被修改。该站点在第一页上有一个 iframe,它会导致样式表等在一秒钟内被请求两次!
如果您删除 Last-Modified,则文件将在第二天被重新请求;但是第二天的请求将不再是 if-modified-since 请求,要求服务器重新发送所有内容而不仅仅是 304 标头。
在 IE9、Firefox 10.0 和 Opera 11.61 上,浏览器会正确缓存并且不会重新请求图像,只会重新请求具有 Cache-Control: no-cache 标头属性的 HTML。
在 Chrome 16.0.912.77 m 和 Safari 5.1.2 (7534.52.7) 上,每次都会对每个页面上的每个图像进行条件请求。服务器以 304 标头响应,再次包含 max-age 属性,但它们都继续请求。
我与响应一起发送的示例 HTTP 标头是:
有人对我如何让这些浏览器尊重我的缓存头有任何建议吗?
所有浏览器都在 Win7 Pro x64 上运行,上面的 HTTP 标头是 Fiddler 的原始输出,所以这正是浏览器接收的内容。
注意:在我发现这是标题字段之间的交互之前,我已经问过一个问题。我已经删除了之前的问题,因为它不再准确。
谢谢
猫
php - 使用 PHP 缓存 HTTP 文件
我正在编写一个通过 HTTP 和 HTTPS 请求文件的库。为了减少经常请求的 URL 的流量,我想缓存检索到的文件并尊重它们的缓存设置。
现在缓存过期似乎是一件困难的事情,因为HTTP RFC定义了很多需要在所有可能的组合中检查的缓存:
Expires
Cache-Control
(有几十个可能的值)Pragma
我可以想象有人已经编写了正确实现所有这些东西的 PHP 代码。它在哪里?
caching - 缓存 Https 响应
如何缓存https响应,在经过身份验证的 url 的情况下缓存它真的安全吗?
http-headers - 缓存在 CDN 中,但不在浏览器中
我目前使用 Akamai 作为 CDN,但我注意到浏览器也在缓存内容。浏览器缓存图像/css/js 很好,但我想知道是否有办法不在浏览器上缓存,而是在 Akamai 中缓存。
现在,我现在从我的原点发送这样的标题:
Akamai 尊重这些标头,但也将它们直接传回给用户。这使得浏览器实际上也缓存了内容。
这在大多数情况下都很有效,但我们也有一些 CDN 逻辑,如果用户有一个登录的 cookie,则绕过 CDN 缓存并直接进入源。
因此,如果假设未经身份验证的用户单击“登录”,则他们将通过登录过程发送并返回同一页面。即使 CDN 会从源请求此页面,浏览器实际上会再次请求相同的页面,并且看起来好像登录没有工作。
现在,我可以强制登录过程添加一个查询参数,如 ?l=1 或其他东西,但必须有更好的方法。
我很想看看 Akamai 是否可以将 Cache-Control 标头覆盖为硬编码的无缓存值,但我想知道是否有办法在源头做到这一点?
谢谢!
http-headers - 跨多个页面的相同脚本的缓存过期
我有一个脚本用于我网站上的多个页面。我想设置 expires 标头,以便浏览器缓存它并且不会每次都下载它。没关系,我知道该怎么做,但我不太清楚浏览器是如何工作的。
浏览器是否根据其路径缓存它,然后它是否足够聪明,知道任何请求脚本的页面都应该使用缓存版本,或者脚本和页面之间是否存在关联,因此必须针对每个页面进行缓存页?
caching - 如果 AppCache (Symfony2) 的第一个响应是私有的,可以吗?
我正在尝试使用http缓存。在我的控制器中,我设置了如下响应:
开发模式
在开发环境中,第一个响应是 200,带有以下标头:
在接下来的 2 分钟内,每个响应都是带有以下标题的 304:
这基本上是我所期望的。
产品模式
在 prod 模式下,响应标头是不同的。请注意,在 app.php 中,我将内核包装在 AppCache 中。
第一个响应是带有以下标题的 200:
所以这是一个私有的无缓存响应。
下一个请求几乎都是我所期望的。带有以下标头的 304:
我应该担心吗?这是预期的行为吗?
如果我将 Varnish 或 Akamai 服务器放在它前面会发生什么?
我做了一些调试,我认为响应是私有的,因为最后修改的标头。HttpCache 内核使用 EsiResponseCacheStrategy来更新缓存的响应(HttpCache::handle()方法)。
如果 EsiResponseCacheStrategy 使用 Last-Response 或 ETag(EsiResponseCacheStrategy::add()方法) ,则EsiResponseCacheStrategy会将响应变为不可缓存:
如果 Last-Response 或 ETag 标头存在,则Response::isValidateable()返回 true。
它会导致覆盖 Cache-Control 标头(EsiResponseCacheStrategy::update()方法):
我在 Symfony2 用户组上问了这个问题,但到目前为止我没有得到答案:https ://groups.google.com/d/topic/symfony2/6lpln11POq8/discussion
更新。
由于我不再能够访问原始代码,因此我尝试使用最新的 Symfony 标准版重现该场景。
响应标头现在更加一致,但似乎仍然是错误的。
一旦我Last-Modified
在响应上设置了标题,浏览器做出的第一个响应就有:
第二个响应有一个预期:
如果我避免发送If-Modified-Since
标头,每个请求都会返回must-revalidate, no-cache, private
.
prod
如果请求是在环境中提出的,则无关紧要dev
。
caching - 版本控制和缓存静态文件:CSS、JS、图像——考虑什么
对于(企业)Web 项目,我想保留以前版本的静态文件,以便项目在准备好实施设计更改时可以自行决定。我最初的计划是为静态内容提供文件夹,如下所示:
这些文件夹中的每个文件都应该有一个缓存策略来“永远”缓存 - 至少一年。我还计划将 css 文件和 js 文件合并为一个,以尽量减少请求数量。
然后我还会提供一个current
文件夹(符号链接到最新发布的版本)
这将解决我的第一个问题(项目和子网站可以将其代码锁定到某个版本,并且可以随时升级)。
但后来我可以看到一些缓存问题。现在我不能“只”缓存current
文件夹,因为每个版本都会改变。我的缓存策略应该在那个文件夹上。
此外,对于每个版本,大多数静态文件无论如何都不会改变。永久缓存它们是否相关,如果有更改则重命名?
我在这里寻求建议,因为我想知道您在缓存和更改文件之间的最佳权衡。
symfony - Symfony 2 中的 Edge Side Includes 和验证缓存
是否可以在带有 Symfony 2 的 ESI 中使用验证缓存?
如果你查看HttpFoundation Response类,你可以看到 isNotModified 是如何工作的:
问题是 ESI $request->headers->get('If-Modified-Since'); 并且 $request->getEtags() 在 ESI 中不返回任何内容......所以缓存永远不会新鲜!
那么你有 $request 的解决方案吗?
如果验证 HTTP 缓存不能在 ESI 中工作,是否有另一种缓存部分的方法?
谢谢 !
jekyll - 基于 Jekyll Bootstrap 的博客 - 标题过期?
我有一个基于 Jekyll 引导的博客,托管在 Github 页面上。
我的问题是:每次我在网页上更改某些内容时,我都必须强制重新加载页面(CTRL + R)才能看到更改。
Jekyll 或我的浏览器似乎没有意识到有更新的版本可供发送。
如何配置 Jekyll 以更好地处理这个问题?
caching - 如何让 Squid 在高负载时绕过连接
我想在物理内存有限的系统上运行 Squid。理想情况下,系统应该不进行页面交换。AFAIK,有两种方法可以实现这一点:
结合触发器修改例程
storeDigestAddable()
(在文件中)以停止缓存文件。在这种情况下,squid 会优雅地降级为只是一个代理,并且不做任何缓存。这使我们免于因在内存中缓存大文件而导致的内存膨胀。store_digest.c
sbrk()
与来自 的触发器一起绕过新连接
sbrk()
。
这两个都需要更改 Squid 代码。您是否遇到/考虑过这个问题?有没有办法通过任何其他方式来实现这个目标(没有交换和有限的物理内存)?如果您能指出任何可能有帮助的 Squid 配置参数,那就太好了。