我有一个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
。现在,如果请求文件的版本化版本,我该如何设置缓存标头,以便文件被缓存更长时间?
换句话说,如果styles.css
请求该文件,则应将其缓存 24 小时,而文件styles.<version-id>.css
则应缓存 365 天。
FilesMatch
我尝试使用此代码片段在重写之前和之后设置缓存:
<FilesMatch ".+\.[0-9a-f]{32}\.[0-9a-z]{2,6}">
Header set Cache-Control "max-age=31536000, public"
</FilesMatch>
但是不行啊,可能是因为文件名被改写了,所以不匹配吧,不知道啊。
我也尝试过使用环境变量:
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
但我也无力让它发挥作用。
有没有办法根据原始请求设置重写请求的缓存策略?
答案1
<FilesMatch>
匹配物理文件(而不是 URL),因此永远不会匹配网址形式styles.<version-id>.css
, 其中 物理 文件 是styles.css
.
<LocationMatch>
(在服务器配置中)相当于 URL,但是您正在重写 URL,并且<Location[Match]>
包装器稍后应用,因此再次,这将永远不会匹配。
(根据这些指令的格式和行为,我假设这些指令位于目录/.htaccess
上下文中,而不是直接位于服务器配置/虚拟主机中?)
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 来设置环境变量,就像您所做的一样。如果直接在服务器配置中使用,这将非常有效。(除了REQUEST_FILENAME
需要更改为LA-U:REQUEST_FILENAME
才能按预期运行,否则该RewriteCond
指令将总是评估为真。)
但是,在每个目录上下文中,重写过程在初始重写和环境变量以 为前缀后重新开始REDIRECT_
(原始环境变量不保留)。因此,您只需更改Header
指令以检查这一点改名环境变量。例如:
Header set Cache-Control "max-age=31536000, public" env=REDIRECT_AutoVersion