【问题标题】:php headers for serving css via php用于通过 php 提供 css 的 php 标头
【发布时间】:2013-03-28 23:46:00
【问题描述】:

事情就是这样。 我正在提供一些压缩的 CSS 内容

(`str_replace(array("\r", "\n", "\t", '\s\s+'), '', cssGoesHere)`) 

通过我页面中的 PHP 文件:

<link rel="stylesheet" type="text/css" href="/css/loader.css.php" />

问题是:如何让浏览器缓存返回的 css,但如果内容发生更改则更新缓存?

PHP 文件没有被修改,所以添加类似

的内容
<?php echo filemtime('/css/loader.css.php'); ?>

href 属性不是一个选项。这可以通过标题解决吗?如果可以,如何解决?因为 AFAIK 如果我像上面写的那样提供它,浏览器只会缓存结果并继续重用缓存(当然,前提是浏览器已启用/能够这样做),但我需要它知道内容何时改变了。

编辑:我已经用我的代码创建了一个 github 项目(尽管自从我写了这个代码后,我为了更灵活而做了很多更改)。这是链接:https://github.com/jurchiks/YACC
如果您有任何建议,请写到我的电子邮件或smth。

【问题讨论】:

    标签: php css caching


    【解决方案1】:

    可以通过 headers cache-control 解决,但事实证明这不是很有效。因为某些浏览器会覆盖或修改您的强制设置。

    我看不到您从哪里获取 CSS 数据,如果它是 CSS 文件,您可以获取 css 文件的 filemtime 作为版本指示符,或者只是在某处提供每次 CSS 文件时必须更改的版本字符串变化。

    顺便说一句,str_replace(array("\r", "\n", "\t", '\s\s+') 并不能有效地删除所有换行符。你应该使用类似的东西

    $foo = nl2br($string, FALSE);
    $bar = str_replace(array('<br>', '\s\s+'), '', cssGoesHere)
    

    改为。

    HTH :)

    【讨论】:

    • 感谢关于换行符的想法,我在我的代码中使用它:) 我也把它放在了 github 上,所以有兴趣的人可以阅读它并可能使用它。
    【解决方案2】:

    在更改时可靠地加载文件的唯一方法是您声明的方法。否则,页面将缓存文件并在它认为必要的时候保留它。如果不请求并至少下载标题,它就无法检查页面是否已更改,如果它已经消失那么远,它还不如只下载页面的其余部分,因为带宽将是最小的。

    如果您确实无法将修改日期附加到 HTML,最好的选择是通过 PHP 设置缓存标头。

    header("Cache-Control: max-age=time-in-seconds");
    

    但这并不总是有效,因为服务器设置和浏览器设置可能会覆盖它,尤其是在高速缓存浏览器(如 Internet Explorer)中。

    【讨论】:

      【解决方案3】:

      您可以将版本号添加到 CSS 链接 href 并使用 mod rewrite 将其路由回原始 CSS 文件。

      例如。假设您从版本 1 开始(注意文件名的版本附录):

      <link rel="stylesheet" type="text/css" href="/css/loader-v001.css.php" />
      

      浏览器会缓存这个文件。下次更新 CSS 文件并且不想让浏览器使用缓存文件时,只需像这样更改版本号:

      <link rel="stylesheet" type="text/css" href="/css/loader-v002.css.php" />
      

      然后,在您的 mod 重写中,将对文件 loader-v{x}.css.php 的任何请求路由到 loader.css.php

      我不确定这是否足以满足您的需求,因为它确实需要手动更改版本号。但是,不同的文件名将确保浏览器将其视为实际的“新”文件并重新下载。

      【讨论】:

      • 但这绝对需要 mod_rewrite 或等效的,因此它不是一个好的选择。虽然这不是一个坏主意。
      • 哦,当然。这当然不是一个包罗万象的解决方案,但值得一提。
      【解决方案4】:

      在您的 css php 页面中使用它:

      header('Content-type: text/css');
      header("Cache-Control: no-cache, must-revalidate");
      

      你可以看到更多information about headers in PHP's official documentation

      【讨论】:

      • 这并不能回答问题 - 它是关于控制浏览器何时重新下载页面,而不是让它将其解释为 CSS。
      • 第一行代码是关于将 php 解析为 css 文件。
      • 当我发布该评论时,您没有说明第二行,只说明了 Content-type 标题。问题不是关于将 PHP 解释为 CSS,因此您的答案是在回答一些没有被问到的问题。不过你现在已经改变了,所以一切都很好。
      • 不是我感兴趣的东西,因为我希望浏览器缓存 CSS 文件。我只是想在生成的 CSS 更改时更新缓存。
      • 我认为它可以帮助你: header("Last-Modified: $last_modified_time");并且不需要在客户端编写任何其他代码
      【解决方案5】:

      我建议将生成缓存内容的时间保存在某个地方,例如 保存 CSS 数据的 style.php 上次修改时间为 21/06/2012 并且缓存内容最后生成于 20/06/2012 对 strtotime() 整数中的日期进行比较,您会看到缓存内容必须从新内容再次生成。

      【讨论】:

      • style.php 不是生成文件,它是生成器文件。它实际上不包含 CSS,因此无法从该文件中判断修改时间,您必须检查实际的 CSS 文件,但这不是这里的想法。
      猜你喜欢
      • 2011-06-03
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 2018-02-08
      相关资源
      最近更新 更多