【问题标题】:Enabling mod_expire depending on request根据请求启用 mod_expire
【发布时间】:2011-11-08 06:11:52
【问题描述】:

我不是生成指向file.js 的链接,而是计算版本号或哈希总和并链接到file--bbe02f946d.js。我正在使用以下重定向规则来提供文件的当前版本:

RewriteRule ^(.*)--[a-z0-9]+\.js$ $1.js

现在,我想为这些请求设置非常遥远的Expires 标头:

ExpiresActive on
ExpiresByType application/javascript "access plus 1 year"

这很好用,但也适用于尚未版本化的资源(/file.js 请求)。如何仅为与 RewriteRule 匹配的请求设置过期标头?通常,我会使用<LocationMatch>,但这不可用,因为应用程序必须能够在我可以修改 htaccess 的任意服务器上运行。

【问题讨论】:

  • 我建议 1) 使用 [E] 标志 (httpd.apache.org/docs/current/rewrite/flags.html#flag_e) 在重写规则中设置一些环境变量 .. 2) 然后使用 Header 根据此类变量值/存在设置适当的标头
  • 如果上述方法不起作用并且您找不到任何其他可行的解决方案..那么也许您可以以某种方式从不同的文件夹中提供这些版本化和尚未版本化的资源 - 那么您可以轻松申请本地 .htaccess 文件中的此类标头。
  • @LazyOne 谢谢,我会尝试使用变量。太伤心了,你懒得写一个完整的答案;)
  • 我不是一个真正的 Apache 人......而且我自己过去也没有这样做过——我“专门”研究 URL 重写规则。我可以自己尝试实现它.. 但我无法在工作之外访问我的开发 Apache 机器,而且几乎所有生产服务器都是 IIS 驱动的(是的 - 懒得在家中的某些虚拟环境上安装 Apache)。

标签: apache .htaccess mod-rewrite http-caching mod-expires


【解决方案1】:

您可以使用 htaccess 添加新的 mime 类型并设置自定义过期标头。

使用 .xjs 的示例

<IfModule mod_mime.c>
    AddType application/x-javascript .xjs
</IfModule>

<IfModule mod_gzip.c>
mod_gzip_item_include file \.xjs$
</IfModule>

<FilesMatch ".(xjs)$">
Header set Cache-Control "max-age=43200"
</FilesMatch>

或者只是在FilesMatch 中使用正则表达式来匹配你的js文件

<FilesMatch "--[a-z0-9]+\.js$">
Header set Cache-Control "max-age=43200"
</FilesMatch>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 2012-06-10
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    相关资源
    最近更新 更多