强制浏览器使用新的CSS

有没有办法检查用户是否有他们的浏览器缓存的CSS的不同版本,如果是这样迫使他们的浏览器拉新版本?

我不知道它是否正确使用,但我认为您可以使用查询字符串强制重新加载css文件:

 

我记得几年前我使用这种方法强制重新加载网络摄像头图像,但时间可能已经开始……

不使用js,只需将css文件名保存在会话变量中即可。 当向主页面发出请求时,您只需使用会话变量名称编写css链接标记。

作为ccs文件名不同,您强制broswer下载它而无需检查浏览器中当前加载的内容。

正如jeroen建议你可以有类似的东西:

  

然后你的StyleSelector.aspx文件应该是这样的:

 <%@ Page Language="cs" AutoEventWireup="false" Inherits="Demo.StyleSelector" Codebehind="StyleSelector.aspx.cs" %> 

你的StyleSelector.aspx.cs是这样的:

 using System.IO; namespace Demo { public partial class StyleSelector : System.Web.UI.Page { public StyleSelector() { Me.Load += New EventHandler(doLoad); } protected void doLoad(object sender, System.EventArgs e) { // Make sure you add this line Response.ContentType = "text/css"; string cssFileName = Request.QueryString("foo"); // I'm assuming you have your CSS in a css/ folder Response.WriteFile("css/" + cssFileName + ".css"); } } } 

这将根据查询字符串参数向用户发送CSS文件的内容(实际上是任何文件,请参阅安全说明)。 现在棘手的部分是进行条件GET,这是用于检查用户是否在缓存中具有页面的奇特名称。

首先,我强烈建议您阅读RSS条件GET for RSS黑客 ,这是一篇很好的文章,解释了HTTP条件GET机制的基础知识。 相信我,这是必读的

我已经发布了一个类似的答案 (但有PHP代码,对不起)到SO问题我可以使用“http header”来检查动态页面是否已被更改 。 将代码从PHP移植到C#应该很容易(如果以后我有时间,我会这样做。)

安全说明:执行类似(“css /”+ cssFileName +“。css”)的操作非常不安全,因为您可以发送相对路径字符串,因此您可以向用户发送不同文件的内容。 您将想出一个更好的方法来找出要发送的CSS文件。

设计说明:您可能希望使用IHttpModuleIHttpHandler而不是.aspx页面,但这种方式可以正常工作。

回答问题1

您可以编写一个inheritance自System.Web.UI.Control的服务器控件来覆盖Render方法:

 public class CSSLink : System.Web.UI.Control { protected override void Render(System.Web.UI.HtmlTextWriter writer) { if ( ... querystring params == ... ) writer.WriteLine("") else writer.WriteLine("") } } 

并在您的MasterPage中插入此类的实例:

 <%@ Register TagPrefix="mycontrols" Namespace="MyNamespace" Assembly="MyAssembly" %> ...  ...   ... 

您应该只是共享一个共同的祖先类,然后如果需要,您可以使用单个js命令轻弹它。

   

等等

我喜欢jeroen建议在样式表URL中添加查询字符串。 您可以在上次修改样式表文件时添加时间戳。 在我看来,它是帮助函数或自定义控件的一个很好的候选者,可以为您生成LINK标记。

我知道这个问题是关于C#的,我假设从某个版本的Windows Server。 由于我不熟悉这些技术,我会给出一个可以在PHP和Apache中运行的答案,你可以从中获得一些东西。

如前所述,只需根据特定查询在页面主体上设置ID或类,例如(在PHP中)

  ...  ...  

你的CSS可以针对这个:

 body#admin h1 { color: red; } body#normal h1 { color: blue; } 

等等

至于CSS下载的强制,您可以使用mod_expires或mod_headers模块在Apache中执行此操作 – 对于mod_headers,这在.htaccess中会阻止缓存的css文件:

  Header set Cache-Control "max-age=0, private, no-store, no-cache, must-revalidate"  

但既然你可能没有使用apache,那对你没有多大帮助:(