强制浏览器使用新的CSS

10

有没有一种方法可以检查用户在其浏览器中缓存的不同版本的 CSS,并且如果有,则强制他们的浏览器拉取新版本?

8个回答

22

我不知道这是否是正确的用法,但我认为你可以使用查询字符串来强制重新加载CSS文件:

<link href="mystyle.css?SOME_UNIQUE_TEXT" type="text/css" rel="stylesheet" />

我记得我几年前用过这种方法来强制重新加载网络摄像头图像,但时间可能已经过去了...


4

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

由于ccs文件名不同,您强制浏览器下载它,而无需检查先前在浏览器中加载了什么。


2
正文:

就像jeroen建议的那样,您可以使用类似以下方式:

<link href="StyleSelector.aspx?foo=bar&baz=foz" type="text/css" rel="stylesheet" />

那么您的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,这是检查用户是否在缓存中具有页面的花哨名称。
首先,我强烈建议您阅读HTTP Conditional GET for RSS hackers,这是一篇解释HTTP条件GET机制基础知识的好文章。相信我,这是必读的。
我已经发布了一个类似的答案(但是使用PHP代码,抱歉)回答了SO问题can i use “http header” to check if a dynamic page has been changed。从PHP到C#转换代码应该很容易(如果以后有时间,我会做的)。
安全提示:像 ("css/" + cssFileName + ".css") 这样做是非常不安全的,因为你可能会发送一个相对路径字符串,从而向用户发送不同文件的内容。你需要想出一种更好的方法来找出要发送哪个 CSS 文件。
设计提示:你可以使用 IHttpModuleIHttpHandler 而不是 .aspx 页面,但这种方式也可以正常工作。

1

问题1的答案

您可以编写从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("<link href=\"/styles/css1.css\" type=\"text/css\" rel=\"stylesheet\" />")
        else
            writer.WriteLine("<link href=\"/styles/css2.css\" type=\"text/css\" rel=\"stylesheet\" />")

    }

}

然后在您的主页中插入此类的一个实例:

<%@ Register TagPrefix="mycontrols" Namespace="MyNamespace" Assembly="MyAssembly" %>
...
<head runat="server">
    ...
    <mycontrols:CSSLink id="masterCSSLink" runat="server" />
</head>
...

0

我喜欢Jeroen的建议,在样式表URL中添加查询字符串。您可以添加样式表文件上次修改的时间戳。对我来说,这似乎是一个很好的候选项,可以使用帮助程序函数或自定义控件为您生成LINK标记。


0
你可能应该分享一个公共的祖先类,这样如果需要的话,你就可以用一个单一的js命令轻松控制它。
<body class="style2">

<body class="style1">

等等。


0

我知道这个问题特别涉及C#,而且我假设它是在某种Windows服务器上运行。由于我对这两项技术都不熟悉,所以我会提供一个适用于PHP和Apache的答案,希望您能从中获得一些启示。

如先前建议的那样,只需在页面主体上设置一个基于特定查询的ID或类别即可(例如,在PHP中)

<?php
if($_GET['admin_page']) {
  $body_id = 'admin';
} else {
  $body_id = 'normal';
}
?>
...
<body id="<?php echo $body_id; ?>">
...
</body>

而且你的CSS可以针对这个进行定位:

body#admin h1 {
   color: red;
}

body#normal h1 {
   color: blue;
}

关于强制下载CSS,您可以使用Apache的mod_expires或mod_headers模块来实现。对于mod_headers,您可以在.htaccess文件中添加以下内容以防止CSS文件被缓存:

<FilesMatch "\.(css)$">
Header set Cache-Control "max-age=0, private, no-store, no-cache, must-revalidate"
</FilesMatch>

但是,由于您可能没有使用Apache,这对您帮助不大 :(


0

就像正确答案中所示,我正在使用一些类似的方法,但是有一些不同之处。

<link href="mystyle.css?v=DIGIT" type="text/css" rel="stylesheet" /> 

作为一个数字,您可以在模板中手动或自动设置实数。例如,在我的项目中,我在管理面板中使用缓存清除模块,每次使用此缓存清除器时,它会自动递增数字。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接