我读到,当您无法访问Web服务器的标头时,您可以使用以下命令关闭缓存:
<meta http-equiv="Cache-Control" content="no-store" />
Run Code Online (Sandbox Code Playgroud)
但我也读到这在某些版本的IE中不起作用.是否有任何<meta>标签可以关闭所有浏览器中的缓存?
我尝试过这个中间件,但浏览器仍在保存文件.
我希望用户将始终获得js和css文件的最新版本.
public void Configure(IApplicationBuilder app)
{
app.UseSession();
app.UseDefaultFiles();
app.UseStaticFiles(new StaticFileOptions
{
OnPrepareResponse = context =>
context.Context.Response.Headers.Add("Cache-Control", "no-cache")
});
}
Run Code Online (Sandbox Code Playgroud) 我在我的本地主机(Windows 7,Chrome v79.0.3945.130(64 位))上测试了一个 html/js 代码,大约 50% 的时间代码更改没有反映在浏览器中(我用开发工具/源看到它)。
互联网上有很多建议,但似乎都不起作用:
<meta http-equiv="Cache-control" content="no-cache">
在标题中 - 没有帮助。<script src="common.js"></script>
为<script src="common.js?blabla"></script>
- 在 60% 的情况下有帮助,但是您需要在每次更改后都执行此操作是一项繁重的工作。此外,它不适用于 html 更改。当我将代码提交到 github.io 时出现完全相同的问题
请帮我制作它,以便网站立即反映代码更改。
编辑:我创建了一个文件 index3.html 并在那里只放了“hello world”。在浏览器中打开文件。改为“hello world2”——浏览器更新了内容。更改为“hello world3” - 即使在多次重新加载和“清空缓存和硬重新加载”之后,浏览器仍然显示“hello world2”。我改为“hello world4”——浏览器仍然显示“hello world2”。4 个小时后,我改为“hello world5”——浏览器仍然显示“hello world2”。我用基本记事本编辑了这个文件。
Edit2:人们一直在问我正在使用什么服务器。这看起来是问题的一部分。不幸的是,我不知道,也不知道我到底需要做什么来检查它。以下是我迄今为止发现的所有内容:
inetpub/wwwroot
放置 html 和 js 文件的目录,然后在浏览器中打开 index.html http://localhost/
。我在Azure上使用以下Web.config托管Web应用程序:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<staticContent>
<mimeMap fileExtension=".text" mimeType="text/plain" />
<clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="7.00:00:00" />
</staticContent>
</system.webServer>
</configuration>
Run Code Online (Sandbox Code Playgroud)
这有效,但我想通过扩展来改变缓存时间.我想将.html文件的最大年龄设置为1天,将其他所有文件的最大年龄设置为365天.原因是html中的所有资产都有其文件名在更改时加速并且是从CDN提供的,因此它们永远不需要过期,但是html页面本身需要始终保持新鲜,以便用户可以看到新内容.
我看到该<location>
元素允许将Web.config过滤到特定位置,但我没有看到将其限制为某些扩展的方法.
请注意,我不要求能够做到这一点在Web.config:任何可能的手段与Azure的Web应用程序的罚款.
我以为我已经成功地缓存破坏了 angular-cli 的--output-hashing
选项设置all
为确保用户获得最新的块/更新。我意识到这并不总是适用于延迟加载的模块。
如果我只对延迟加载模块 + 构建 + 部署到 IIS进行更改,并转到属于延迟加载模块的 URL,那么我会按预期获得最新更改。
但是,如果我关闭并重新打开浏览器并转到不属于延迟加载模块的 URL,然后单击将我带到延迟加载模块的链接,则不会观察到最新更改。
几乎就像浏览器假设每当我从未更改的模块进入应用程序时没有任何更改,并且稍后在我访问已更改的模块时不会选择新块。
更奇怪的是,当我尝试复制问题以提供一些屏幕截图时,问题就消失了。
有没有其他人遇到过使用输出哈希与缓存破坏不一致的情况?
编辑:
进一步调查后,事实证明,如果我转到我网站的着陆页 [IP 地址]:[端口],那么 index.html 来自缓存。
相反,如果我转到任何其他路由 [IP 地址]:[端口]/[路由],那么 index.html 来自服务器。
由于 index.html 指向 inline.(hash).bundle.js,后者又指向延迟加载的模块,因此获取 index.html 的旧副本会导致获取旧版本的 inline.js 和其他模块。
我尝试添加<meta http-equiv="expires" content="0" />
到 index.html 并清除浏览器缓存,但仍然从缓存中获取文件。
我也尝试在 web.config 中添加一个部分,但这也不起作用。
如何确保 index.html 始终来自服务器?
我正在使用.Net core和angular 5创建一个网站。我使用最新的.Net core angular template(dotnet new angular
与安装的.Net core 2.1一起使用)创建了该项目。
该项目使用angular cli来构建/打包并将哈希应用于绑定的js和css文件:
但是,将网站发布到azure应用程序服务后,我发现当浏览到该网站时,会看到旧版本,直到用F5手动刷新(不需要Ctrl-F5)。这似乎是因为尽管js / css文件不会被缓存,但包含这些文件引用的index.html页面将从缓存中提供。
当我按F5重新加载网站时,home
从网站请求index.html(以下)(本例中为304,因为它没有更改,如果有,它将获取最新的):
但是,当我最初加载页面(通过书签或输入地址等)时,直接从缓存中提供页面:
这是预期的行为吗?为什么第一次加载页面与按F5相比有何不同?并且我可以防止缓存吗?
angular ×2
angular-cli ×2
html ×2
.net-core ×1
asp.net ×1
azure ×1
caching ×1
firefox ×1
iis ×1
iis-7 ×1
javascript ×1
server ×1
web-config ×1