问题标签 [http-status-code-304]

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 投票
1 回答
1960 浏览

php - 如何获得 PHP 生成的 javascript 文件的 304 响应?

我有以下 PHP 文件:

所以它是一个 .php 文件,但它被解释为一个 JavaScript 文件。我会将它加载到这样的网页中:

我的问题是关于访问此文件时发送的 HTTP 代码。每次我请求此文件(直接或通过请求它的网页)时,Chrome 开发工具都会显示 200 OK 的状态。即使内容没有改变,它也绝不是 304。

在内容没有改变的情况下,是否可以为这样的动态生成的文件获得 304 Not Modified ?如果不是,为什么?

我还使用了一些允许路由的 PHP 框架,例如:/js/myjavascript.js. 所以我可以把上面的代码放在那个路由中,以同样的方式动态生成 JavaScript。但同样,每次仍然是 200,即使内容没有改变并且 URI 是一个 .js 文件。

有解决方案吗?在我的情况下,这个 javascript/php 文件的内容大约每天更改一次。所以我需要我的访问者浏览器大部分时间缓存文件(304 未修改),但是当它发生变化时,我需要他们的浏览器下载并缓存新版本(200 OK)。

0 投票
3 回答
206 浏览

javascript - 为什么页面上已经加载的图像会再次加载?

我正在使用删除和替换 dom 中图像的 src

我正在尝试将其与加载事件一起使用。我预计只有在页面上尚未加载 imgURL 时才会触发 load 事件。

相反,有时会触发加载事件。我可以在 chrome 网络选项卡中看到图像何时以 304 Not Modified 状态返回。

我知道如何解决这个问题,但我只是好奇这是否正常。

我想表达这个问题的最佳方式是什么会导致浏览器再次尝试加载已经加载到页面上的图像?有一个缓存杀手,但是在我再次显示图像之前它没有被更新。

0 投票
2 回答
4979 浏览

browser-cache - 浏览器多次发送相同内容(PNG 图像)的请求

我在apache服务器上托管了一个名为icons.png的 PNG 文件。基本上这个文件是其他小图像元素(CSS Sprite)的组合。当页面第一次加载时,此文件会以正常的200 OK响应加载。

页面加载后;有一些链接悬停在其上触发自定义工具提示。工具提示将来自icons.png文件的部分图像显示为某些 HTML 元素的背景图像

例如 HTML 代码是这样的:

jQuery(".profile").tipTip({delay: 200, defaultPosition: "top", content: "<a href='#' style='width: 32px; height: 32px; display: block; 背景:网址(图片/图标.png) no-repeat -200px -64px'></a>"});

[HTML文件中还有一些其他地方引用了icons.png ]


现在,每次我将鼠标悬停在链接上时,都会显示工具提示,但同时浏览器正在向服务器发送 HTTP 请求以获取icons.png文件。来自服务器的响应代码是304 Not Modified

虽然没有获取文件的内容,但是每次发送标头(大约 166 字节)的开销仍然存在,这反过来又导致了1.5 秒的延迟我的连接速度非常慢)。在这 1.5 秒的时间里,工具提示元素没有背景图像,突然图像突然出现。


下面是一些截图

  • Chrome 网络面板:

铬合金

  • Firebug 网络面板:

火狐

  • HTTP 标头:

标头


据我所知,一旦获取资源,浏览器应该将其保存在缓存中并在必要时从那里获取,而不是多次请求服务器

我发现服务器没有随内容一起发送任何“ Expires ”或“ Cache-Control ”标头。我不确定这是否是 Chrome 出现这种异常行为的原因。任何建议都受到高度赞赏。

PS:该应用程序托管在Heroku的共享托管环境中。我在 Ubuntu 12.04 x86_64 上使用 Firefox 15.0 和 Chrome 版本 21.0.1180.89。

0 投票
0 回答
845 浏览

php - Jquery 304 未修改问题

我正在 WAMP 服务器上使用 jquery、php、jquerymobile 构建应用程序。应用程序中的所有内容都可以正常工作,直到我尝试返回另一个页面并且它应该根据该函数触发一个pageinit函数。它似乎没有触发,因此页面是空白的,并且没有将 json 数据放入页面中。当我使用 firebug 检查事件时,我在控制台中意识到该页面出现 304 Not Modified 错误,我读到该错误与缓存有关。如何在我的 ajax 请求中阻止这种情况发生,缓存值设置为 false。

0 投票
1 回答
1065 浏览

php - 我是否必须再次发送带有 304 Not Modified 标头的 ETag?

当奇怪的事情发生时,我正在使用 PHP,使用 ETags、IF_NONE_MATCH 等。我编写了下面的代码,用于检查 IF_NONE_MATCH。如果它与我的 ETag 匹配,我会发送一个 304 响应标头。如果没有,我会发送其他标题告诉浏览器缓存页面,以及我的 ETag。我期望获得一次页面,然后一直获得 304。相反,我得到了一次页面,然后是 304,然后是页面,然后是 304,等等。当我检查 Chrome 的标题视图时,我看到如果我没有在 304 代码中再次设置 ETag,它不会下次我收到该页面时,将其发送回其请求标头中。这是正常行为还是只是 Chrome?难道我做错了什么?

这是代码:

0 投票
2 回答
3851 浏览

asp.net-web-api - 缓存从 Web api 服务返回的图像

无论我做什么,我都无法从 web api 缓存返回图像,每次我请求图像时都会看到对服务器的请求。

我已经为标题设置尝试了许多 permiations,这是我最近的努力:

这就是我使用 chrome 检查时响应标头的样子:

缓存控制:必须重新验证,最大年龄 = 60 内容长度:24233

内容类型:图像/jpeg 日期:2013 年 4 月 14 日星期日 22:04:32 GMT

服务器:Microsoft-IIS/8.0 X-AspNet-版本:4.0.30319

X-Powered-By:ASP.NET

X-SourceFiles:=?UTF-8?B?Qzpcc291cmNlXFRydW5rXFRlc3RcYXBpXHRlc3RcMQ==?=

关于如何进行的任何想法?

0 投票
2 回答
6884 浏览

jquery - jQuery ajax ifModified 在调用缓存响应时不兑现,何时应为 304

我正在使用 jQuery ajax 从 ASP.Net MVC 应用程序中检索 json,并且在进行 ajax 调用时我没有看到预期的结果ifModified = true .

我正在使用 jQuery 1.9.1 和 Chrome 版本 26.0.1410.64 m

当使用新的浏览器实例并对已缓存的内容发出初始请求时,即使在 ajax 配置中设置了 ifModified=true,也不会调用服务器来检查缓存状态。在来自同一浏览器实例的后续请求中,(预期)调用服务器,服务器以 304 响应。

在初始请求中,浏览器网络跟踪显示内容是从缓存中传递的,状态为 200,即使从未检查过修改日期。Fiddler 显示未发出请求,并且未命中 ASP.Net MVC 控制器中的断点。

这是一个错误,还是有办法让它正常工作?如果是错误,是 jQuery 错误还是 Chrome 错误?

这是一个简化的 ajax 调用:

这是一个简化的 ASP.Net MVC 控制器方法:

重现步骤:1)启动新的浏览器实例 2)启动 ajax 请求 3)关闭响应警报窗口 4)启动 ajax 请求 5)关闭浏览器重复

第一次通过,清空缓存:第 2 步向服务器发出请求。服务器响应 200。步骤 4 向服务器发出请求,服务器响应 304。

第二次通过 - 缓存中的响应:步骤 2 不向服务器发出请求。响应来自状态为 200 的缓存。步骤 4 向服务器发出请求,服务器响应 304。

我希望第二次通过第 2 步向服务器发出请求并收到 304。

每次使用缓存源时都无法检查其状态是一个大问题,因为缓存数据可能是陈旧的,但用户在同一浏览器实例中发出后续请求之前不会知道它。

0 投票
1 回答
335 浏览

http - 对动态生成的远程文件使用 If-Modified-Since 标头

我们的网络服务器会定期从其他网络服务器下载图像。为了防止我们的服务器每天都必须下载相同的图像,即使它没有更改,我计划在图像下载时存储 Last-Modified 标头,然后将该日期放入后续请求的 If-Modified-Since 标头中同一个文件。

我可以正常工作,除非在请求时即时生成远程文件(例如,如果它在从单独的原始文件请求时为 Web 生成特定大小的版本)。在这种情况下,Last-Modified 标头是远程服务器响应请求的日期,因此先前下载的存储的 Last-Modified 标头始终比后续请求的标头更早,因此图像将始终被下载,我永远不会得到 304 Not Modified 状态码。

那么,当远程服务器提供动态生成的图像时,有没有办法降低下载频率?

在我看来这是不可能的,但我想我还是会问。

0 投票
1 回答
650 浏览

caching - 使用 maxage 标头时不可能有 304 响应

我正在尝试缓存静态内容,我希望该内容的生命周期为一小时并且内容是公开的,对每个人都一样。

我的控制器中有以下代码:

但该isNotModified()函数总是返回 false。

PS:我使用的是 Symfony 2.0.22

0 投票
7 回答
118152 浏览

node.js - NodeJS/express:缓存和 304 状态码

当我重新加载使用 express 制作的网站时,我在 Safari(不是 Chrome)中得到一个空白页面,因为 NodeJS 服务器向我发送了 304 状态代码。

如何解决这个问题?

当然,这也可能只是 Safari 的问题,但实际上它在所有其他网站上都可以正常工作,所以它也必须是我的 NodeJS 服务器上的问题。

为了生成页面,我将 Jade 与res.render.

更新:似乎出现此问题是因为 Safari'cache-control': 'max-age=0'在重新加载时发送。

更新 2:我现在有一个解决方法,但有更好的解决方案吗?解决方法:

更新 3: 所以完整的代码部分目前是: