如何强制更新/防止在 Linux 上运行并由 nginx 反向代理服务器托管的 .NET Core Web 应用程序的 HTML 缓存

Posted

技术标签:

【中文标题】如何强制更新/防止在 Linux 上运行并由 nginx 反向代理服务器托管的 .NET Core Web 应用程序的 HTML 缓存【英文标题】:How to force updates / prevent HTML caching of .NET Core web application running on Linux and hosted by an nginx reverse proxy server 【发布时间】:2021-07-21 13:10:37 【问题描述】:

我使用 .NET Core 5.0 MVC 在 C# 中编写了我的 Web 应用程序。 我在控制器中使用路由将 URLS 映射到并提供使用 Razor 的视图。 我使用 .Net 核心运行时在 Linux 服务器上运行应用程序,然后使用 nginx 反向代理服务器托管应用程序。

我经常对我的网站进行更改,它依赖于从我的数据库中实时拉取数据以向用户显示最新的统计数据,因此我提供的视图必须是最新的。


问题:出于某种原因,我可以发布和部署新代码,它会在我的桌面上正常显示,但在移动设备或我朋友的桌面上却不行(有时会,有时不会)。如果我将 URL 稍微像 google.com/test 更改为 google.com/Test,我可以看到新的变化。我的路径也不区分大小写,但我的所有 SEO/google 链接都有小写/缓存版本。


经过研究,我得出结论,不同的浏览器/应用程序正在缓存我的 html/JS/CSS,而不是从服务器获取最新的。

我尝试了以下方法

安装 NuGet 包“Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation”并调用

  services.AddControllersWithViews().AddRazorRuntimeCompilation();

在我的 ConfigureServices 方法中。

将以下内容添加到我的布局文件中:

  <meta http-equiv="cache-control" content="max-age=0" />
  <meta http-equiv="cache-control" content="no-cache, no-store, must-revalidate">
  <meta http-equiv="expires" content="-1" />
  <meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
  <meta http-equiv="pragma" content="no-cache" />

将此添加到返回视图的控制器操作中:

[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]

我正在使用 nginx 反向代理服务器托管我的网络应用服务器,我尝试添加一些我在网上看到的内容以防止缓存失败。

对于我的移动设备(运行 Chrome 的 android),没有任何东西始终如一地工作。

有其他人遇到过这种情况或可能知道解决方案吗?

【问题讨论】:

您是否尝试在 nginx 或 asp.net core 中添加缓存头? I concluded that the different browsers/apps are caching my HTML/JS/CSS and not getting the latest from the server. 非常好。这意味着您不必为出站流量付费以一遍又一遍地提供相同的结果,您不必为 CPU 和 RAM 付费来加载客户端已有的结果。而且移动客户端不必为昂贵的数据付费来检索他们已经拥有的数据。即使您禁用缓存,您的 ISP 也几乎肯定会缓存 GET 响应以降低它们的成本。所有网站都大量使用缓存。不要禁用缓存,而是使用合理的值 @abdusco 我尝试添加 proxy_no_cache 1; proxy_cache_bypass 1;并过期; @PanagiotisKanavos 你所说的合理价值观是什么意思?我只是希望数据库驱动的网站能够反映数据库中当前的内容。 ASP.NET Core 默认缓存 API 响应。您以某种方式启用缓存。默认情况下,ASP.NET Core 不会发出任何缓存标头。这意味着您和移动客户端之间的路由、代理和缓存可以为所欲为。他们不应该缓存响应,但正如我所说,ISP 会大量缓存所有内容。缓存由 HTTP 标头 控制,而不是元标记。代理和缓存不解析内容,它们只查看标题 【参考方案1】:

你试过用ASP.NET提供的asp-append-version吗?

css/js可以这样用

        <link rel="stylesheet" href="~/css/site.css" asp-append-version="true"/>

【讨论】:

以上是关于如何强制更新/防止在 Linux 上运行并由 nginx 反向代理服务器托管的 .NET Core Web 应用程序的 HTML 缓存的主要内容,如果未能解决你的问题,请参考以下文章

如何在更新参数时强制 CloudFormation 堆栈更新?

防止滚动 AngularJs 上动态更新的可滚动 div

如何防止方法跨多个线程运行?

强制 SVN 更新/签出覆盖本地文件

防止 AWS Amplify 添加斜杠和强制重定向

如何在 Linux/Mac 中更新 PHP curl 扩展?