问题标签 [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.

0 投票
2 回答
435 浏览

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

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

  • 假设我有一个客户端请求应用程序/json 中的人员。我查找它并创建我的 ETag 并将此人的 JSON 表示发回
  • 现在,同一个客户端在同一个 URI 上对同一个人(尚未修改)发出另一个请求,但希望它在 application/xml 中。

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

0 投票
2 回答
3184 浏览

caching - expires、max-age 和 shared max-age 有什么区别?

我从未使用过HTTP 缓存

我在Symfony 文档页面上找到了这些缓存选项。

我只是想知道 , 和 headers 之间有expires什么max-age区别s-maxage

0 投票
1 回答
219 浏览

javascript - Chrome(可能还有其他浏览器)缓存我的脚本包括

问题:

我在客户的网站上托管了一个小部件,该小部件对于网站上的每个页面都是不同的。

为了呈现小部件,客户端在其页面上包含一个脚本标签。该脚本标记为网站上的每个页面加载,它返回的代码取决于页面。

因此,如果此脚本被缓存,最终结果是我们为错误页面提供了一个小部件。

现在,当我们提供脚本时,我们在响应头中设置

但有时浏览器仍会缓存脚本。

问题:

有没有办法在所有情况下都使用 http 标头来停止缓存,还是我们必须采取完全不同的方法?

更新:

topek 推荐的标头大大提高了脚本的不可缓存性。但是,(再次在 Chrome 中似乎是最具缓存攻击性的)当使用后退、前进或重新加载按钮时,脚本仍会被缓存。如果你真的点击任何东西,它将从服务器获取。

似乎停止缓存的唯一万无一失的方法是设置保证每个页面加载都不同的脚本源(如 esilija 和 tejs 所建议的那样)。

0 投票
2 回答
5207 浏览

java - 是否有一个 HttpClient 可以自己处理缓存请求?

我有一个应用程序需要重复请求网络上的内容。现在,服务器端实现遵循使用标头的 http 缓存标准。我想知道是否有 HttpClient 的扩展版本或其他工具可以存储响应并与标头交互以进行自动缓存。如果没有一个很好,如果已经有一个工具,我只想跳过实现这个。

谢谢

0 投票
1 回答
345 浏览

php - HTTP 缓存、用户身份验证和 PHP

我正在使用 PHP 开发一些软件,并且正在尝试使其有效地利用 HTTP 缓存。但是,我最近遇到的问题之一是登录后,登录之前访问的页面被缓存并且不像登录一样。

如果 PHP 和客户端之间存在 HTTP 缓存,这尤其是一个问题。如果我将缓存限制器设置为始终为“公共”,则页面可能将始终被缓存(即使通过代理缓存)。如果我在未登录时将缓存限制器设置为“公共”,在登录时设置为“私有”在,我目前遇到的问题可能仍然会发生。如果我将缓存限制器设置为始终是私有的,代理缓存根本不会受益,并且我目前遇到的问题可能仍然会发生。

这个问题的理想解决方案是什么?有没有办法在用户登录后让网络浏览器“重试”?对于代理缓存,我知道有一些方法可以根据传入的 cookie 进行缓存,所以我相信这可以解决部分问题。但是从网络浏览器的角度来看,这个问题又如何呢?

0 投票
2 回答
1019 浏览

html - 如何为缓存的 html 文件触发浏览器 html 刷新?

YSLOW 建议: 对于静态组件:通过设置远期 Expires 标头来实施“永不过期”策略....如果您使用远期 Expires 标头,则必须在组件更改时更改组件的文件名。在雅虎!我们经常将此步骤作为构建过程的一部分:版本号嵌入在组件的文件名中,例如 yahoo_2.0.6.js。 http://developer.yahoo.com/performance/rules.html

我想为我的大部分静态页面利用缓存,并在版本 # 更改时重新加载 js 文件。我为我的 .js 文件设置了版本号,但我的 main.html 页面将 Expires 设置为未来,因此它不会重新加载,因此不会重新加载 js 文件。理想情况下,我想告诉浏览器(使用通灵技术)在发布新版本的站点时重新加载 main.html。我可以让我的 main.html 页面总是重新加载,但是我失去了缓存的好处。我不是在寻找 ctrl-F5 答案,因为这需要为我们的用户自动发生。

我认为答案是:main.html 不能被缓存,但我想听听其他人在做什么来解决这个问题。您如何获得最佳缓存与重新加载优势。

谢谢。

0 投票
3 回答
1639 浏览

ruby-on-rails-3 - Heroku & Rails - Varnish HTTP 缓存不起作用

我的 heroku 网站的根页面本质上是静态的,它在生成时在视图中有一些 ruby​​ 代码,但是没有特定于单个用户的,所以我希望它由 Varnish 缓存并在不打我的测功机的情况下提供服务(注意应用程序中还有其他动态页面)。

Heroku 在这里看起来很简单。只需添加 response.headers['Cache-Control'] = 'public, max-age=300',它会在重新生成之前缓存 5 分钟。

Time.now为了测试这一点,我进行了更改并将日期(在同一个浏览器上刷新工作正常,但我认为这是因为浏览器缓存,而不是 Heroku。

如果有任何帮助,当我执行 curl -i 来获取 HTTP 标头时,我会得到以下信息:

基本上,我想确保它生成一次,然后缓存在 Varnish 中,我是否缺少任何选项,我是否需要配置更多内容?如果您对提供快速静态页面有其他建议,我也会喜欢这些建议。

谢谢!

0 投票
1 回答
88 浏览

php - php缓存错误

我的控制面板用户中有一个页面,需要密码才能访问。

我这样做的顺序是:

  1. 使用我要访问的页面的参数转到“密码请求页面”。
  2. 检查密码,如果正确,则用“散列页面名称”填充会话变量
  3. 重定向到我要访问的页面。
  4. 此页面检查“哈希会话”是否与此“页面名称”匹配
  5. 如果匹配,则清除会话并显示整个页面,如果不匹配则重定向到初始页面。

问题是:在第 4 步,页面有时会读取后期会话更新。有时它没有显示任何值,但很多时候它显示正确的值,如果我刷新页面,会话仍然有正确的散列数据(在第 5 步,如果匹配,我已经清除了会话变量),怎么会?

我尝试用mysql的数据记录更改会话变量,但我得到了相同的结果。phpmyadmin 显示记录已设置,但页面显示没有数据集。否则,删除记录后,页面仍然显示之前的记录值。

这是否意味着缓存有问题?我也做了标题没有缓存,例如:

但我得到的结果仍然相同。有什么建议吗?

更新:如果我不断刷新页面,可能刷新 3 或 5 次后,它会显示正确的值。如何使其实时?那么如果会话设置,页面可以直接检查设置的值,如果会话清除,那么页面会询问密码。?

0 投票
0 回答
375 浏览

jquery - 禁用 ServiceStack 304?

我有一个 IService,当 jQuery.ajax 在 IE 中请求它时,ServiceStack 总是返回 304 并且不执行我的服务。我试过 ResponseFilters,切换到 RestServiceBase,并通过 HttpResult 返回 200。我错过了什么?

解决了。

ServiceStack 正在正常工作。我曾尝试使用 ResponseFilters 添加 CacheControl: no-cache 标头,但令我惊愕的是,我一直收到 304。然后我意识到这是因为没有 Cache-Control 标头的原始响应位于 IE 的缓存中,因此是 304。清除 IE 的缓存让一切正常 :-)

0 投票
2 回答
161 浏览

html - 如何告诉 IE6 不要缓存 html/页面?

我正在使用 PHP 使用以下代码,

在所有浏览器中,它似乎都可以正常工作,但在 IE6 中却不行,除非我按 Ctrl+F5 强制刷新页面。如何在 IE6 中停止缓存?