为重写的请求设置caching策略

我有一个RewriteRule重写包含文件版本的文件的任何请求没有版本:

 RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.+)\.[0-9a-f]{32}(\.[0-9a-z]{2,6})$ $1$2 [L] 

这意味着只要文件styles.<version-id>.css被请求,就会被重写为styles.css 。 现在,如果要求文件的版本化版本,我怎样才能设置caching头文件,以便文件被caching更长的时间?

换句话说,如果文件styles.css被重新定义,它应该被caching24小时,而文件styles.<version-id>.css应该被caching365天。

我已经尝试使用此代码片段重写之前和之后使用FilesMatch设置caching:

 <FilesMatch ".+\.[0-9a-f]{32}\.[0-9a-z]{2,6}"> Header set Cache-Control "max-age=31536000, public" </FilesMatch> 

但它不起作用。 也许它不匹配,因为文件名被重写。 我不知道。

我也尝试使用环境variables:

 RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.+)\.[0-9a-f]{32}(\.[0-9a-z]{2,6})$ $1$2 [L,E=AutoVersion] Header set Cache-Control "max-age=31536000, public" env=AutoVersion 

但是我也无法得到这个工作。

有什么方法可以根据原始请求设置重写请求的caching策略吗?

<FilesMatch>与物理文件(而不是URL)匹配,所以这将永远不匹配表单styles.<version-id>.css ,其中物理文件是styles.css

<LocationMatch> (在服务器configuration中)与URL等效,但是您正在重写URL,并且<Location[Match]>包装应用较晚,所以这将永远不匹配。

(基于这些指令的格式和行为,我假定这些指令位于目录/ .htaccess上下文中,而不是直接在服务器configuration/虚拟主机中?)

 RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.+)\.[0-9a-f]{32}(\.[0-9a-z]{2,6})$ $1$2 [L,E=AutoVersion] Header set Cache-Control "max-age=31536000, public" env=AutoVersion 

但是你可以用mod_rewrite来设置一个环境variables – 就像你所做的一样。 如果直接在服务器configuration中使用的话,这将会工作得很好。 (除了REQUEST_FILENAME需要更改为LA-U:REQUEST_FILENAME才能按预期运行,否则RewriteCond指令将始终为真。)

但是,在每个目录上下文中,重写过程在初始重写和环境variables的前缀为REDIRECT_ (原始环境variables不保留)之前重新开始。 所以,你只需要改变你的Header指令来检查这个重命名的环境variables。 例如:

 Header set Cache-Control "max-age=31536000, public" env=REDIRECT_AutoVersion