我有一个嵌入flash(flex)应用程序的html页面.
我有以下标题:
<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-STORE">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="-1">
Run Code Online (Sandbox Code Playgroud)
此外,每次我发布新版本的应用程序时,我都会更改文件名.因此,它变成MyApp_v1.swf,然后更新为MyApp_v2.swf.
尽管如此,chrome仍然会缓存html页面和swf文件.这是一个主要问题,因为客户端不会看到更新的swf,除非他们清除浏览器缓存.
我甚至尝试通过更改htaccess文件来解决这个问题,并重命名托管swf文件的index.html文件:
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://www.mysite.com/app[R,L]
DirectoryIndex index.html #this was changed from myapp.html
Run Code Online (Sandbox Code Playgroud)
即使在这样做之后,Chrome仍然会缓存swf,并且仍在从旧的html文件中读取.我在html上做了一个视图源,它仍然显示旧文件.
这在任何其他浏览器中都可以正常工作.
我的应用程序的一部分提供了使用该redirect()方法下载的文件.我发现Chrome(而不是Firefox或IE,很奇怪)正在缓存此文件,以便即使更改了服务器端也会下载相同的版本.据我了解,有一种方法告诉浏览器不缓存文件,例如像这样的HTML,或通过添加一些东西到HTTP标头.我可能会在较低级别的Web框架中找到这些,但我不知道如何在Play!中获取标题,并且HTML选项将无法工作,因为它不是HTML文件.
似乎总是有一种聪明而简单的方法在Play中执行常见任务!那么有一种聪明而简单的方法可以防止控制器中的缓存吗?
谢谢!
Matt将我指向http.cacheControl设置,该设置控制整个站点的缓存.虽然这可以工作,但我对缓存的大部分网站都没有问题,特别是CSS等.如果可能的话,我想一次控制一个URL的缓存(在这种情况下指向下载文件的那个).它并不会成为一个高流量的网站,所以这只是学术兴趣.
理想情况下,我想做的事情如下:
public static void downloadFile(String url) {
response.setCaching(false); // This is the method I'm looking for
redirect(url); // Send the response
}
Run Code Online (Sandbox Code Playgroud) 这个问题已被多次询问,但并不是这个例子的具体问题.
以下是我们的应用程序概述:
在开发过程中,我希望缓存更改胸部文件而不是那些核心库,以加快我的页面重新加载并加快我的开发.
我找到了解释:
可以解决方案:
我正在尝试在iphone模拟器上测试一个网站,我做了一些javascript更改,我的javascript文件正在从缓存中加载.
我看到旧的版本文件与safari web检查器,资源选项卡(在模拟器窗口上),网络调用也有状态304.我已经在macos Safari上禁用了缓存.我已经尝试在模拟器设置上删除safari缓存.模拟器外部的Safari正在正确加载新文件(我清空/禁用了缓存).
我在Sierra的XCode上使用Simulator(10.0 SimulatorAPP-745.10和iOS 10.3)
如何删除或禁用模拟器缓存?
我在TypeScript文件中更新了一些脚本,但用户似乎仍然可以获得捆绑脚本的旧版本.我怎么知道?因为我在日志中看到(远程)JavaScript错误,这些错误引用了新的最新版本中100%存在的类.它已经超过6个小时了,我可以验证它?={hash}已经改变了.
我感觉嫌疑人,无论是单向还是组合中的任何一种:
我感觉它存在于某种缓存中,或者它与静态内容服务有关.或者使用Script.Render().
原因是什么?它让我发疯,因为我知道该网站已被某些用户破坏,但我无法解决问题.
我在下面列出了标题.
这是捆绑包的代码.请注意,Core.js是由TypeScript生成的.
{
var bundle = new Bundle("~/scripts/main-bundle");
bundle.IncludeDirectory("~/scripts/fork", "*.js", searchSubdirectories : true );
bundle.IncludeDirectory("~/scripts/app", "*.js", searchSubdirectories : true );
bundle.Include("~/scripts/bundles/core.js");
bundles.Add( bundle );
}
Run Code Online (Sandbox Code Playgroud)
更新
如果他们得到旧的HTML,因为它可能被缓存,所以hashbomb不会改变 - 他们是否应该仍然拥有一对JS和HTML?
我试图建立一个站点,以便用户只能访问自己的图像和音频文件。为此,我在URL中使用了变量,例如:
<img src="/public/get_file.php?type=image&file=pic001.png" />
Run Code Online (Sandbox Code Playgroud)
在前端,我正在使用React JS(不确定这对这个问题是否重要)。但是在后端,PHP脚本将验证用户已登录(仅通过检查一个简单的SESSION变量),并在用户的数据目录中查找该文件(基于其SESSION变量中的用户ID)。如果存在,它将使用XSendFile将其返回给用户。
我遇到的问题是,每次用户尝试访问文件时,在加载文件之前都会有一些延迟。这告诉我它们可能没有被浏览器缓存。
为什么文件没有被缓存?它与URL参数有关还是与PHP / XSendFile的使用有关?
如何允许我的文件(图像/音频)被缓存?
更新资料
根据要求,这里是我的get_file.php:
<?php
session_start();
if (empty($_SESSION['auth']['id'])){
exit;
}
require_once("../../api_modules/settings.php");
$developer_id = $_SESSION['auth']['id'];
$type = preg_replace('/[^-a-zA-Z0-9_]/', '', $_GET['type']);
$file = preg_replace('/[^-a-zA-Z0-9_\.]/', '', $_GET['file']);
$file = preg_replace('/[\.]{2,}/', '', $file);
$project_id = preg_replace('/[^0-9]/', '', $_GET['project_id']);
$developer_id = preg_replace('/[^0-9]/', '', $developer_id);
if ($type == "image")
$file = FILEPATH ."files/$developer_id/$project_id/images/thumbs/88x88/$file";
else if ($type == "full_image")
$file = FILEPATH ."files/$developer_id/$project_id/images/originals/$file";
else if ($type == "audio"){
$file = FILEPATH ."files/$developer_id/$project_id/audio/$file";
}
else {
exit;
}
header("X-Sendfile: …Run Code Online (Sandbox Code Playgroud) 我需要显示几个完全相同的iframe。该iframe具有从#URI 读取的javascript,然后执行不同的请求,但是iframe的源代码和获取的资源完全相同。
1个iframe(包括javascript,样式表和图片)约为10 mb。现在,假设我需要在同一页面上最多显示10个iframe。那是最大100 mb的页面!
问题在于,iframe本身或它们正在加载的内容均未直接缓存。(至少不是在Google Chrome上,这是我的主要目标)。
这是我的代码的示例:
<iframe src="myiframe#1">
<iframe src="myiframe#2">
<iframe src="myiframe#3">
...
Run Code Online (Sandbox Code Playgroud)
每个iframe都加载相同的巨大javascript文件,并且针对我所拥有的iframe数量都触发了相同的请求:
我们可以清楚地看到,当第一个js文件下载完毕时,另一个(甚至还没有启动的连接!)没有使用缓存,而是重新下载了。每个文件都一样。
我尝试了什么?
发送缓存头。目前正在回覆,cache-control: public, max-age=31536000但我甚至尝试过更严格的限制,例如Cache-Control: immutable
首先仅加载一个iframe,然后在加载时加载所有其他iframe。即使第一个iframe已完全加载,它仍不使用缓存,并且应该将资源保存在缓存中!
克隆iframe,但是,如RFC所述,它会完全重新加载iframe,从而再次触发请求。
但是,在我页面的第二次加载中,浏览器确实在缓存中获取资源,但这对我来说还不够。
我能想到的绝望(也是唯一的?)解决方案:
加载所有资源和iframe源代码,然后动态创建一个iframe元素并将所有内容注入其中。这是可能的,但是非常困难。另外,可能不是很友好的性能。
注意:iframe不在我的域中,但是我正在做一些反向代理操作,因此我可以控制iframe。这意味着我可以修改iframe的源代码,但是由于所有内容都被缩小了,所以这并非易事。
我有一个Web应用程序,可以让浏览器长时间缓存AJAX请求.我已经找到了如何在检测到可能的修改时提出完全绕过缓存的请求.但我想让用户触发数据刷新.
在这种情况下,我希望浏览器检查服务器是否停止缓存,但如果不缓存则使用它(即,如果服务器响应304代码).目标是节省加载时间,因为数据量巨大.
服务器在所有响应中包含以下标头:
Cache-Control: private, max-age=604800
Last-Modified: ... # actual last modification date
Run Code Online (Sandbox Code Playgroud)
我设法通过在请求中使用以下HTTP标头完全在Chrome中破解了缓存对象(尚未测试其他浏览器):
Cache-Control: max-age=0
If-Last-Modified: Tue, 01 Jan 1970 01:00:00 +0100
Run Code Online (Sandbox Code Playgroud)
这If-Last-Modified条线是真正具有效果的线.Chrome似乎忽略Cache-Control了请求中的标头.
我还发现Cache-Control: must-revalidate在服务器响应中使用强制浏览器为每个请求验证其缓存与服务器.
但有没有办法重新验证只有一个精确的请求,在客户端决定?
请注意,我并没有特别依赖于使用HTTP标头执行此操作,因此欢迎任何其他我不了解的方法!
每当我运行项目时,从远程服务器请求许多文件(CSS、图像和 js)并且项目加载缓慢。
为了处理这个问题,我在 Chrome DevTools 的网络选项卡(用于缓存所有文件)中取消选中禁用所有文件的缓存,如下所示:
但是当我需要一些文件(例如 test.js,...)时,问题就开始了,因为它们变化很快,所以没有缓存。
如何在 google chrome DevTools 中禁用某些文件(JS、CSS、...)的缓存?
javascript browser google-chrome developer-tools browser-cache
根据文档:
Clear-Site-Data 标头清除与请求网站关联的浏览数据(cookie、存储、缓存)
现在尝试一下,您可以在屏幕截图(Firefox v76)中看到,在Clear-Site-Data浏览器中的“响应”部分中进行了设置,但是您仍然可以看到资产“已缓存”:
注意:即使在一段时间后来回导航后,缓存的资源似乎也没有被清除。
我的印象是这会立即发生,但我无法让它发挥作用。这应该立即发生还是在一段时间后发生,或者我只是错过了其他一些事情?
为关心的人更新:
Clear-Site-Data似乎只适用于localhost或https
http cache-control browser-cache http-headers clear-site-data
browser-cache ×10
javascript ×4
http ×2
http-headers ×2
ajax ×1
apache ×1
asp.net ×1
azure ×1
browser ×1
caching ×1
html ×1
iframe ×1
ios ×1
java ×1
node.js ×1
php ×1
reactjs ×1
requirejs ×1
safari ×1
typescript ×1
x-sendfile ×1
xcode ×1