【问题标题】:.htaccess cache static content (unless modified)?.htaccess 缓存静态内容(除非修改)?
【发布时间】:2026-01-24 08:35:02
【问题描述】:

想知道这在 .htaccess 中是否可行?

我目前正在通过 PHP 缓存 .js、.css 和所有图像文件(并且仅当文件没有通过检查 filemtime() 进行修改时才提供缓存)。

但是有人建议它可以通过 .htaccess 更快地实现,所以希望有人能提供一些启示……我环顾四周,发现了各种 sn-ps,但没有一个能涵盖我所追求的。

【问题讨论】:

    标签: .htaccess browser-cache


    【解决方案1】:

    如果你在你的 apache 服务器上安装了mod_expires,你可以在你的.htaccess 文件中加入类似的东西。这个例子是面向 PHP 的(实际上是从 Drupal 7 .htaccess 文件中获取的),但应该作为一个很好的起点。

    FileETag MTime Size
    <IfModule mod_expires.c>
      # Enable expirations.
      ExpiresActive On
    
      # Cache all files for 2 weeks after access (A).
      ExpiresDefault A1209600
    
      <FilesMatch \.php$>
        # Do not allow PHP scripts to be cached unless they explicitly send cache
        # headers themselves. Otherwise all scripts would have to overwrite the
        # headers set by mod_expires if they want another caching behavior.
        ExpiresActive Off
      </FilesMatch>
    </IfModule>
    

    【讨论】:

    • 谢谢,但是如果缓存内容被修改会发生什么情况,它会在缓存被清除之前仍然检索缓存的内容,还是自动更新?
    • 抱歉,我没有完全阅读那一点,我更新了上面的代码,在顶部包含 FileETag 标识符,它告诉服务器如果内容没有发送完整的响应改变了。有一个fuller explanation here,但想法是如果内容已更改,则将返回新内容。
    • 太棒了,用那个sn-p,它会将所有非.php文件(如静态)缓存2周,如果文件被修改,它会自动返回修改后的版本?跨度>
    • 是的 :) 任何发送If-Match 标头的客户端(大多数现代浏览器都会这样做)将能够利用缓存功能。快速阅读Wikipedia entry on ETags,它很好地全面描述了它们的使用
    最近更新 更多