IIS 缓存文件从未被替换

IIS cached files never replaced

也许我的 Google 搜索措辞不正确,可能遗漏了一些信息,但我 运行 遇到了 IIS 8.5 和缓存问题。我有一个服务器设置,按照所有标准应该只提供静态文件。显然,当一个文件被更改时,应该提供新文件。问题是,即使在服务器重新启动、将文件设置为立即过期、禁用缓存、禁用压缩并关闭任何其他缓存功能后,仍会提供具有旧时间戳的旧文件。

我有以下设置:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <security>
            <requestFiltering allowHighBitCharacters="false">
                <verbs allowUnlisted="false">
                    <add verb="GET" allowed="true" />
                </verbs>
            </requestFiltering>
        </security>
        <caching enabled="false" enableKernelCache="false" />
        <urlCompression doStaticCompression="false" />
    </system.webServer>
    <location path="" overrideMode="Deny">
        <system.webServer>
        </system.webServer>
    </location>
    <location path="" overrideMode="Allow">
        <system.webServer>
        </system.webServer>
    </location>
</configuration>

文件所在的文件夹具有只读权限。有趣的事实是,如果我转到 mydomain.com,会显示旧版本,但转到新 mydomain.com 会加载新文件(即使它们都指向相同的 IP 地址)。

如果与响应一起发送的缓存控制 header(s) 指示内容在给定时间段内不会更改,则 HTTP 客户端可以使用文件的旧版本。内容是否在服务器上更改并不重要。

例如,如果文件与 header 一起发送:

Cache-Control: Max-age=86400

然后客户端可以在 24 小时内使用该文件而无需联系服务器。如果服务器上的文件发生变化,客户端不会知道文件发生了变化,因为它甚至不会向服务器发出请求。

您可以添加 must-revalidate 缓存控制属性以强制客户端始终发出服务器请求。

正如我在对 storsoc 的回复中指出的那样,我们的问题是我们的负载平衡器(一台 F5 服务器)正在尝试通过缓存我们的站点来尽可能多地从我们的 Web 服务器卸载。有关如何强制删除缓存条目的信息,请参阅 K13255: Displaying and deleting HTTP cache entries from the command line (11.x and later)