我这里有小问题。这就是我的web.config的样子:
<add name="Cache-Control" value="no-cache, no-store, must-revalidate, private" />
<add name="Pragma" value="no-cache" />
但是当我检查ZAP工具时,我有类似的东西:
Cache-Control: no-cache,no-cache, no-store, must-revalidate, private
Pragma: no-cache,no-cache
因此pragma中的值是重复的,在某些响应中,Cache-Control具有&#34; public&#34;在开头像:
Cache-Control: public, no-cache, no-cache, no-store, must-revalidate, private
有没有办法只从我的web.config设置标题?
另一个问题是有没有办法在主响应中设置标题但在响应是.css和.js文件时禁用它们?我希望它们被缓存。
答案 0 :(得分:1)
我认为Cache-Control标头也是由ASP.NET的Output Caching基础设施设置的。
我不建议通过手动设置Cache-Control标头来对抗ASP.NET ...您希望ASP.NET的输出缓存基础结构为您完成。可以在web.config的outputCache
元素中配置输出缓存。有关配置输出缓存的更多信息,请参见here。
你可能不需要过多担心Pragma
标题(除非你期望从1990年开始有很多pre-HTTP 1.1客户端!)。
静态js / css内容的标头通常由IIS直接处理,因为ASP.NET(通常)不提供静态内容。 This discussion会让你指向正确的方向。
答案 1 :(得分:1)
首先 - 重复不应成为问题。
HTTP RFC2616说:
可能存在具有相同字段名称的多个消息头字段 在消息中,当且仅当该标头的整个字段值 字段被定义为以逗号分隔的列表[即,#(值)]。它必须 可以将多个标题字段合并为一个 “field-name:field-value”对,不改变语义 消息,通过将每个后续字段值附加到第一个,每个 用逗号分隔。头字段具有相同的顺序 因此,接收字段名称对于解释是重要的 组合字段值,因此代理不得改变 转发消息时这些字段值的顺序因此,多个 具有相同名称的标题是正确的(www-authenticate就是这种情况)if 整个字段值定义为以逗号分隔的值列表。
您可以找到更多信息here。
对于具有特定文件扩展名的文件的缓存设置,您可以查看IIS中的输出缓存部分。
答案 2 :(得分:0)
我为我找到了解决方案。
我创建了attriburte并将其添加到基本控制器:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public sealed class NoCacheAttribute : ActionFilterAttribute
{
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
filterContext.HttpContext.Response.Cache.AppendCacheExtension("no-store, must-revalidate, private");
base.OnResultExecuting(filterContext);
}
}
[NoCache]
public class BaseController : Controller
现在我的所有.js,.css,.png,.jpg文件都被缓存,但我的请求在缓存中不可见:)