这是关于应用程序请求路由和动态禁用某些请求的磁盘缓存(请求来自经过身份验证的用户;它们是否经过身份验证可以由自定义代码决定)。
在我的设置中,有一个运行 ARR 的服务器,将请求分派到不同服务器上的 ASP.NET MVC 站点。该站点使用表单身份验证(有时是 HTTP 基本身份验证),因此身份验证发生在 MVC 站点上,而不是在 ARR 中:基本上,当用户进行身份验证时,站点会创建一个表单身份验证 cookie。
我希望在 ARR 中发生以下情况:
- 为匿名用户做输出缓存。
- 对于经过身份验证的用户,仅缓存静态文件(例如 .css、、.js、.jpg 文件),不缓存动态页面。
这种情况下怎么可能有缓存配置规则呢?我尝试了多种方法:
- 缓存头:MVC 应用程序发送的缓存控制头在这里不可用,因为想象一下:第 1 页在 ARR 的缓存中。用户验证并访问页面 1。MVC 应用程序将发送一个 no-cache 标头,但请求未到达它,因此用户获取缓存版本。
- 无缓存 URL:尽管我可能定义了不应缓存其中包含“no-arr-cache”的 URL 将与 URL 重写一起使用,即使用自定义 URL 重写提供程序我会将经过身份验证的请求重写为...?无 arr 缓存。除了不关心查询字符串的 ARR 缓存控制规则之外,问题在于 ARR 在评估缓存配置规则时只考虑请求的 URL,而不是重写的 URL。
先感谢您!
我从IIS 论坛交叉发布了这个,因为那里没有人回复。
这就是我解决它的方法。
我们必须牢记以下前提:
最重要的想法是更改请求的 URL,或者更确切地说,根据用户是否经过身份验证,使用 IIS URL 重写以不同方式重写它。未经身份验证的用户使用 /my-page?authenticated=false 获取所有页面,使用 /my-page?authenticated=true 获取经过身份验证的页面。页面将仅为匿名用户缓存,因此 ARR 不会为经过身份验证的用户找到任何匹配的缓存条目。这样,第三点就解决了。不利的一面是,附加到 URL 的查询字符串可能会出现在 HTML 正文中,应该使用 IIS URL Rewrite 去除这些字符串。
要指示 ARR 不缓存当前请求,请将 ARR_CACHE_CONTROL_OVERRIDE 服务器变量设置为“1,no-cache”(您可以通过重写规则执行此操作)。
您可以通过 IIS URL Rewrite IRewriteProvider 检测用户是否经过身份验证(请参阅教程),即您可以使用此类提供程序的输出为经过身份验证的用户和匿名用户以不同的方式重写 URL。
希望对某人有所帮助。
配置 Cache-control 仅适用于 HTTP/1.1,要禁用旧 IE 浏览器的缓存,您需要配置
以下文章提供了更多详细信息:禁用 ARR 中的缓存