【问题标题】:Apache: set max-age or expires in .htaccess for directoryApache:在 .htaccess 中为目录设置 max-age 或 expires
【发布时间】:2013-05-25 14:55:36
【问题描述】:

我有一些目录,其内容永远不会改变。

是否可以创建 .htaccess 文件告诉浏览器该目录和子目录中的任何内容都可以缓存很长时间?

如果可能,我想在每个目录中复制相同的 .htaccess 文件。

如果可能,您会推荐 max-age over expires 还是两者兼而有之?

【问题讨论】:

    标签: apache cache-control mod-expires


    【解决方案1】:

    所以看起来确实可行.... .htaccess 文件语法是:

    Header unset Last-Modified
    FileETag none
    ExpiresActive On
    ExpiresDefault "access plus 1 years"
    

    这将关闭 Etags 并打开缓存控制:max-age

    然后把这个.htaccess文件放到目录下,所有文件(包括它的子目录)都会缓存1年。

    我决定将所有可缓存的内容放在一个根目录下,并将httpd.conf 编辑为

    <Directory "C:\somedir\cache">
      Header unset Last-Modified
      FileETag none
      ExpiresActive On
      ExpiresDefault "access plus 1 years"
    </Directory>
    

    我仍在对此进行测试。我只是希望这不会关闭网站其余部分的 Etags。到目前为止,它看起来正在按计划工作。


    更新(6 个月后):

    最好设置 ExpiresDefault 并允许使用电子标签。

    在 httpd.conf 中:

    <Directory "C:\somedir\cache">
       ExpiresActive On
       ExpiresDefault "access plus 1 year"
    </Directory>
    

    确保“somedir”位于 apache 根目录中(例如 htdocs)。

    允许电子标签是一件好事,因为 1 年后,浏览器将通过传递电子标签重新验证文件。 Web 服务器将发回 304 - Not Modified 并将 max-age 重置为 1 年。这非常有效。

    总而言之,您可以查看 apache 日志文件并看到 /cache 目录中的项目开始提供一次。

    注意:我发现如果你愿意,可以设置Header append Cache-Control "public"


    最终版本:

    这是最终版本:(只需将其添加到 httd.conf 的底部)

    <Directory "C:\somedir\cache">
       ExpiresActive On
       ExpiresDefault "access plus 1 year"
       Header append Cache-Control "public"
    </Directory>
    

    检查标题应该会发现:

    Accept-Ranges:bytes
    Cache-Control:max-age=31536000, public
    Connection:Keep-Alive
    Content-Language:en
    Content-Length:746
    Content-Type:text/css
    Date:Thu, 29 May 2014 15:23:50 GMT
    ETag:"240000000add63-2ea-4f4086d72ad01"
    Expires:Fri, 29 May 2015 15:23:50 GMT
    Keep-Alive:timeout=40, max=200
    Last-Modified:Fri, 07 Mar 2014 18:28:59 GMT
    

    这将:

    1. 将 max-age 设置为 1 年(推荐最长)
    2. 发送有效期为1年的标签
    3. 发送一个 Etag,这样 1 年后浏览器将执行 etag 验证
    4. 让中间缓存设备/服务知道他们可以将文件缓存 1 年。

    【讨论】:

    • 最终版本有错字 - 目录路径中有双“”。
    • 已修复。谢谢。
    【解决方案2】:

    仅供参考,如果您执行上述操作并且您的 Apache 不会重新启动,那么您可能会收到此错误:

    The Apache service named  reported the following error:
    >>> Invalid command 'ExpiresActive', perhaps misspelled or defined by a module not included in the server configuration.
    

    您可以通过单击“开始”找到该错误,输入“计算机管理”,启动它,在树中打开“事件查看器 -> Windows 日志 -> 应用程序”。这就是我发现上述错误的地方。

    简单修复,只需在 httpd.conf 中取消注释此行:

    #LoadModule expires_module modules/mod_expires.so
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 2017-02-09
      • 1970-01-01
      • 2011-12-08
      • 2020-09-06
      • 2021-01-08
      • 1970-01-01
      相关资源
      最近更新 更多