这是关于应用程序请求路由和动态禁用某些请求的磁盘缓存(其中请求来自经过身份验证的用户;是否经过身份验证可以由自定义代码决定)。
在我的设置中,有一台运行 ARR 的服务器,它将请求发送到另一台服务器上的 ASP.NET MVC 站点。该站点使用表单身份验证(有时使用 HTTP 基本身份验证),因此身份验证发生在 MVC 站点上,而不是 ARR 中:基本上,当用户进行身份验证时,站点会创建一个表单身份验证 cookie。
我希望 ARR 中发生以下情况:
- 为匿名用户进行输出缓存。
- 对于经过身份验证的用户,仅缓存静态文件(例如 .css、.js、.jpg 文件)而不缓存动态页面。
对于这种情况,如何制定缓存配置规则?我尝试了多种方法:
- 缓存标头:MVC 应用发送的缓存控制标头在这里不可用,因为想象一下:第 1 页位于 ARR 的缓存中。用户进行身份验证并访问第 1 页。MVC 应用将发送无缓存标头,但请求未到达它,因此用户获取缓存版本。
- 无缓存 URL:虽然我可能定义包含“no-arr-cache”的 URL 不应缓存,但可以使用 URL 重写,即使用自定义 URL 重写提供程序,我会将经过身份验证的请求重写为 ...?no-arr-cache。除了 ARR 缓存控制规则不关心查询字符串之外,问题在于 ARR 在评估缓存配置规则时仅考虑请求的 URL,而不是重写的 URL。
先感谢您!
我从IIS 论坛因为那里没人回复。
答案1
这就是我解决问题的方法。
我们必须牢记以下前提:
- ARR 通过其 URL 来识别缓存项目(根据配置,包含查询字符串;这应该是配置)。
- 在请求期间,可以指示 ARR 不要缓存当前请求的输出。
- 如果当前请求(URL)的输出之前已被缓存,那么我不知道如何指示 ARR 不要使用缓存版本。
主要想法是更改请求的 URL,或者更确切地说,根据用户是否经过身份验证,使用 IIS URL Rewrite 以不同的方式重写它。未经身份验证的用户将获得所有页面,例如 /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。
希望这对某人有帮助。