问题标签 [if-modified-since]

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 回答
1671 浏览

javascript - 使用 Javascript 刷新图像,但前提是在服务器上进行了更改

如果图像已在服务器上更新,我想在页面上重新加载图像。在其他问题中,有人建议做类似的事情

强制重新加载图像,但这意味着即使它真的没有改变,它也会被再次下载。

是否有任何 Javascript 代码会导致使用正确的If-Modified-Since标头生成对同一图像的新请求,因此只有在实际更改时才会下载图像?

更新:我仍然很困惑:如果我只是请求典型的 URL,我会得到本地缓存的副本。(除非我让服务器将其标记为不可缓存,但我不想这样做,因为整个想法是不要重新下载它,除非它真的改变了。)如果我更改 URL,我将始终重新-下载,因为新 URL 的重点是打破缓存。那么如何获得我想要的中间行为,即仅当文件与本地缓存副本不匹配时才下载文件?

0 投票
1 回答
533 浏览

php - 读取 PHP CGI 中的 If-Modified-Since 标头

我的 PHP 脚本依赖于能够读取If-Modified-Since标头的值(是的,我知道该怎么做)。

当我将 PHP 用作 mod_php 时它工作正常,但现在我已经切换到 suPHP (CGI),看来 Apache 本身处理包含此标头的请求,根本没有将它们转发到 PHP。

这很愚蠢,因为 Apache 不可能知道我的动态生成的 CSS 文件(这是我的脚本所做的)何时更改。在这方面我该如何规范 Apache?

0 投票
2 回答
1073 浏览

php - 让浏览器同时发送 If-None-Match 和 If-Modified-Since

我的浏览器没有为 PHP 生成的内容发回 If-Modified-Since 标头

在我的脚本发送的第一个请求中:

它在它发送的第二个请求中:

对于服务器首先发送的其他文件:

我的浏览器在下一个请求中发送以下内容:

为什么它会发送 If-Modified-Since 标头

0 投票
3 回答
3460 浏览

http - If-Unmodified-Since/If-Modified-Since 的意义何在?他们不是被ETags取代了吗?

似乎有两种不同的方法可以使用 HTTP 标头来实现条件请求,这两种方法都可以用于缓存、范围请求、并发控制等......:

  1. If-Unmodified-Since 和 If-Modified-Since,客户端发送资源的时间戳
  2. If-Modified 和 If-None-Modified,客户端发送资源的ETag表示。

在这两种情况下,客户端都会发送它拥有的有关资源的一条信息,这允许服务器确定自客户端上次看到资源以来资源是否已更改。然后,服务器根据客户端提供的条件标头决定是否执行请求。

我不明白为什么有两种不同的方法可用。当然,ETag 取代了时间戳,因为服务器可以很容易地选择从时间戳生成 ETag。

所以,我的问题是:

  • 在哪些情况下,您可能更喜欢 If-Unmodified-Since/If-Modified-Since 而不是 ETags?
  • 在哪些情况下您可能需要两者?
0 投票
5 回答
206475 浏览

http - 为什么在使用 HttpWebRequest 时某些链接上出现“(304)未修改”错误?

任何想法为什么在我尝试使用 HttpWebRequest 访问的某些链接上我得到“远程服务器返回错误:(304)未修改。” 在代码中?

我正在使用的代码来自Jeff 的帖子(页面似乎已经消失,请参阅Wayback Machine 的存档副本)。

注意代码的概念是一个简单的代理服务器,所以我将浏览器指向这个本地运行的代码,它获取我的浏览器请求,然后通过创建一个新的 HttpWebRequest 来代理它,正如您将在编码。它适用于大多数站点/链接,但对于某些站点/链接来说,会出现此错误。您将在代码中看到一个关键位,它似乎将 http 标头设置从浏览器请求复制到它的请求到站点,并复制到标头属性中。不确定问题是否与它如何模仿请求的这一方面有关,然后当结果返回时会发生什么?

例如,我从http://en.wikipedia.org/wiki/Main_Page得到问题

PS。在这里更新

仍然无法解决这个问题。基本上我可以识别出 1 个有问题的链接,它似乎工作正常,第二次出现错误,第三次正常,第四次出现错误,第五次正常等。好像有一些状态没有被清除或代码中的一些东西。我尝试使用“使用”类型语句等来清理代码。

这是代码。如果有人能发现为什么我每次第二次浏览到http://newsimg.bbc.co.uk/css/screen/1_0_16/nol/v4/story.css之类的链接(从第二次开始,而不是第一次)通过这个代理代码,我得到了我想听到的错误。

这是我看到的一个例子 - 第一次命中很好,第二次有错误......

0 投票
1 回答
10758 浏览

http - (弱)ETags 和 Last-Modified

据我了解规范,在 RFC 2616 (HTTP/1.1) 中引入的 ETag 是 Last-Modified-Header 的继承者(某种意义上),它旨在让软件架构师对缓存重新验证过程。

如果缓存验证标头(If-None-Match 和 If-Modified-Since)都存在,根据 RFC 2616,客户端(即浏览器)在检查资源是否已更改时应使用 ETag。根据 RFC 2616 的第 14.26 节,如果 If-None-Match-Header 中出现的 ETag 已更改,服务器不得以 304 Not Modified 响应,并且服务器必须忽略额外的 If-Modified-Since-Header ,如果存在。如果呈现的 ETag 匹配,他不得执行请求,除非 Last-Modified-Header 中的日期如此说明。(如果呈现的 ETag 匹配,则服务器应在 GET 或 HEAD 请求的情况下以 304 Not Modified 响应...)

本节为一些猜测留下了空间:

  • 一个强大的 ETag 应该“每次”都改变,资源会改变。因此,必须以 304 Not Modified 之类的其他内容响应具有未更改的 ETag 和 If-Modified-Since-Header,不匹配的请求有点矛盾,因为强 ETag 说,资源是未修改。(不过,这并不是那么致命,因为服务器可以再次发送相同的未更改资源。)
  • ...

...好的,当我写这篇文章时,问题正在归结为这个答案:

上述(小)矛盾是由于弱 ETags 造成的。标有 Weak ETag 的资源可能已更改,尽管 ETag 没有。因此,如果是弱 ETag,当 ETag 未更改但 If-Modified-Since 中显示的日期不匹配时,以 304 Not Modified 回答是错误的,对吧?

0 投票
0 回答
184 浏览

caching - 登录/注销后的浏览器缓存

我有一个带有基本登录/注销系统的站点。

当我显示页面时,我会检查页面的最后修改时间以及浏览器是否发送了 if modified since 标题。如果它没有被修改,我发送一个304标题并退出。

这显然会更快地加载页面,并且对我来说意味着更少的内存和处理能力,因为我不必构建页面内容。

但是,我发现如果用户登录然后查看未修改的页面,他仍然会看到“登录”按钮,如果他注销并查看未修改的页面也是如此,他会看到该选项到logout.

304对于任何希望使用未修改的标头的人来说,这似乎是一种常见的情况,但我正在努力寻找任何关于如何解决它的讨论。

任何帮助将不胜感激(我意识到我没有提供太多信息,但我不确定还能说什么这是不言自明的)

0 投票
2 回答
199 浏览

.net - .NET 中是否有现有的 WebRequest 缓存解决方案(基于 If-Modified-Since)?

我有一个昂贵的 WebRequest,我知道它可以被缓存。

是否存在允许缓存基于 Last-Modified/If-Modified-Since 和(可选)ETags 的 Web 请求的现有解决方案?

0 投票
7 回答
16158 浏览

http - Chrome - 为什么它发送 if-modified-since 请求?

我有一个包含很多小图像(图标)的页面。与 chrome 一起使用时,每次重新加载页面时,chrome 都会使用 if-modified-since 标头从服务器请求每个图标。

所有图标都带有 expires 和 max-age 标头。Firefox 从其缓存中加载图像。

为什么 chrome 会这样做,我该如何防止呢?

谢谢

0 投票
1 回答
442 浏览

php - 为什么 PHP 区分 .php 和 .abc 扩展名以进行缓存?

PHP引擎如何处理仅文件扩展名不同的相同文件之间似乎存在问题。

问题:“一个 If-Modified-Since 条件请求返回的全部内容没有改变。”

此外,我测量到 .php 扩展名的加载速度比具有 .xxx 扩展名的相同双胞胎快得多,即使文件内容相同,它们仅在文件扩展名上有所不同。

替代文字

替代文字

“HTTP 允许客户端发出条件请求以查看他们持有的副本是否仍然有效。由于此响应具有 Last-Modified 标头,因此客户端应该能够使用 If-Modified-Since 请求标头进行验证。RED 已经完成并发现即使资源没有更改,它也会发送完整的响应,表明它不支持 Last-Modified 验证。”


首页以.php

替代文字


完全相同的文件,但结束.ast

替代文字


鉴于:

将 home.php 文件复制为 home.xxx,并将此扩展名添加到 htaccess 以将其识别为 PHP 文件。.php 文件监听新鲜度设置为 3 小时的 php.ini,非 .php 文件必须监听新鲜度设置为 2 小时的 htaccess,根据:

到目前为止一切顺利,一切都加载了,除了非 php 文件没有正确缓存,或者它缓存很好但没有很好地验证,更具体地说。请参阅随附的图片。只有非 php 文件扩展名会导致错误并且加载速度较慢。

整个 page.php 加载速度更快,因为其中的所有元素然后从缓存中正确加载,而 page.abc 在它应该被缓存时返回了完整的请求,这意味着整个页面更慢。

底线:应该改变什么,以消除返回完整内容不变的 If-Modified-Since 条件请求?