【问题标题】:caching page assets缓存页面资产
【发布时间】:2012-03-02 22:15:45
【问题描述】:

为了减少对 UI 资产 (JS/CSS) 的 HTTP 请求,我编写了一个 PHP 脚本来组合这些文件并将其提供为:“assets/basic,login,jquery-ui-10.css”和这很好用,但我决定更进一步,并要求浏览器通过在 PHP 脚本中添加过期标头来缓存这些资产组合器(我称之为它们)。当然,在这里我使用 htacess RewriteRule 功能来引用这个脚本 assets.php?files=basic,login,jquery-ui&type=css&version=10 到上面的那个,使它看起来像一个 CSS 文件供浏览器缓存它(这样看起来不错:))。我也使用“版本”参数来强制浏览器更新文件,但不会发生!!,我已经添加了这些头信息来缓存文件:

    header("HTTP/1.1 304 Not Modified");
    header("Expires: Sat, 1 Jun 2015 12:00:00 GMT");
    header("Cache-Control: must-revalidate");

然而,当我尝试更改上面 URL 字符串中的版本参数时,尽管文件名已更改,但它不会下载新的文件内容 > 用于浏览器

我在这里做错了什么,如何强制浏览器重新下载具有不同名称的新文件(但仍发送上述标头)

提前致谢

【问题讨论】:

    标签: php javascript css .htaccess user-interface


    【解决方案1】:

    正如 Quentin 所说,您必须仅发送 304 响应来响应 IF-Modified-Since 或 If-None_match 请求。通过发送 304 响应,您是在告诉浏览器使用缓存副本 即使它没有缓存副本

    在实践中,使用 304 响应实际上可能无法达到提高性能的目的,并且通常最好忽略条件请求并使用内容 和新的缓存指令进行 200 响应

    如果您希望缓存内容,请发送 max-age 和 Expires 标头(仅 HTTP/1.0 客户端需要 expires 标头 - 所有现代浏览器都实现 HTTP1/1 - 即使您明确告诉他们使用 HTTP/1.0)。

    例如

    header("Expires: Sat, 1 Jun 2015 12:00:00 GMT");
    header("Cache-Control: max-age=94608000,must-revalidate");
    

    【讨论】:

      【解决方案2】:

      你不能。 “未修改”的全部意义在于它告诉浏览器该文档与它获得的最后一个版本相同,并且不应该下载它。

      AFAIK,您应该只在响应If-Modified-Since 请求时发送它。

      【讨论】:

        猜你喜欢
        • 2011-02-02
        • 2011-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-13
        • 2012-04-07
        • 1970-01-01
        相关资源
        最近更新 更多