在Apache中有条件地设置缓存头信息

12

我想根据所访问的文件路径有条件地设置缓存头。基本上,访问http://www.example.com/cache/$cache_key/*应该提供带有远期缓存头的文件。

我正在使用重写规则来设置环境变量,然后尝试根据该变量设置缓存控制标头。但是,似乎变量是在进程中设置得太晚或其他什么问题;有条件的头规则从未被执行。

RewriteRule ^cache/.*?/(.*) /$1 [env=asset:true,L]
Header set Cache-control "max-age=30"
Header set Cache-Control "max-age=31536000" env=asset
Header unset ETag env=asset

有更好的方法吗?我尝试过几种Directory和Location块的组合,但没有成功。

1个回答

20

使用 phpinfo(),我确定重写请求中的环境变量最终并没有被设置,因此问题不在于请求的顺序,而在于它似乎将变量丢掉了。使用查询字符串而不是URL和进行重写似乎是唯一能够使其正常工作的方式。我同意,看起来应该有更好的方法。

RewriteCond %{QUERY_STRING} longcache=true(&|$)
RewriteRule .* - [ENV=LONGCACHE:true,L]

Header set Cache-Control "max-age=30" env=!LONGCACHE
Header set Cache-Control "max-age=31536000" env=LONGCACHE

打开眼界可以获得更多不同的答案:

在重定向之后,您的asset环境变量将被重命名为REDIRECT_asset,因此您的条件Header指令需要是:

Header set Cache-Control "max-age=31536000" env=REDIRECT_asset

谢谢,不知怎么的我错过了这个答案。 - mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接