【问题标题】:cache headers for dynamic css (generated via PHP)动态 css 的缓存头(通过 PHP 生成)
【发布时间】:2011-01-24 15:13:34
【问题描述】:

我的 CSS 文件实际上是一个 PHP 文件,其内容类型为 text/css,因此我可以在该文件中使用 PHP 变量。 style.php 看起来像这样:

<?php
header('Content-Type: text/css');
$bgColor = '#000';
?>

body { background:<?php print $bgColor; ?>; }

它按预期工作,但如果浏览器缓存动态创建的 css 文件,我有点担心。

在 firebug 中查看请求时,在我看来,每次我重新加载页面时,浏览器都会重新加载 style.php

我已经尝试添加这些缓存头:

header('Cache-control: must-revalidate');
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 60 * 60 * 24) . ' GMT');

但没有运气。每次加载页面时仍会加载该文件。为了强制浏览器将文件缓存一段时间,适当的标头是什么?

【问题讨论】:

    标签: php css dynamic caching header


    【解决方案1】:

    如果你想让一个文件被浏览器缓存,你应该将 Cache-control 头设置为 public:

    header('Cache-control: public');
    

    必须重新验证意味着浏览器将检查文件是否已更新,这将调用您的 PHP 脚本。

    【讨论】:

    • 根据 HTTP/1.1 规范,这不是 must-validate 应该的意思——它只应该在缓存的内容变得陈旧(如 Expires 标头或Cache-Control 中的 max-age 值),但某些浏览器似乎确实忽略了规范并发送请求。但是,除非连接经过身份验证,否则“public”实际上并不适用。我会使用 'Cache-Control: max-age=86400' 来加强 Expires 标头中的时间。
    • @Brock Batsell:感谢您的评论!这澄清了它,它现在适用于 max-age=XXXX
    • 如果文件内容发生变化,请求的文件将不会被更新。 OP 要求如果内容发生更改,则不应缓存该文件。如果文件内容没有改变,那么它应该被缓存。您提供的代码打开了“缓存”功能。它不能解决 OP 的问题。
    • 以上答案必须更新以反映 cmets 和解决方案。
    【解决方案2】:

    这段代码解决了你的问题。

    它检查“最后修改”变量并为文件分配一个 eTag。 如果 eTag 被修改(或文件被修改),则显示该文件。否则,会出现 304 HTTP 错误,说明该页面未被修改。

    eTag 正是您要寻找的。​​p>

    代码:

    <?php 
    // Custom variables
    $variables = array('#CCC','#800'); // from db
    
    // CSS Content
    header('Content-type: text/css');
    
    // Last Modified
    $lastModified = filemtime(__FILE__);
    
    // Get a unique hash of this file (etag)
    $etagFile = md5_file(__FILE__);
    
    // Get the HTTP_IF_MODIFIED_SINCE header if set
    $ifModifiedSince = (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] : false);
    
    // Get the HTTP_IF_NONE_MATCH header if set (etag: unique file hash)
    $etagHeader = (isset($_SERVER['HTTP_IF_NONE_MATCH']) ? trim($_SERVER['HTTP_IF_NONE_MATCH']) : false);
    
    // Set last-modified header
    header("Last-Modified: ".gmdate("D, d M Y H:i:s", $lastModified)." GMT");
    
    // Set etag-header
    header("Etag: $etagFile");
    
    // Make sure caching is turned on
    header('Cache-Control: public');
    
    // Check if page has changed. If not, send 304 and exit
    if(@strtotime($ifModifiedSince) == $lastModified || $etagHeader == $etagFile){
       header("HTTP/1.1 304 Not Modified");
       exit;
    }
    ?>
    body {background: <?php echo $variables[0]; ?>;}
    

    【讨论】:

      猜你喜欢
      • 2017-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-20
      • 2015-09-01
      相关资源
      最近更新 更多