2011-10-18 35 views
10

我想根据访问的路径文件来有条件地设置缓存标头。基本上,访问http://www.example.com/cache/$cache_key/*应该在将来的缓存标题中提供远处的文件。有条件地在apache中设置缓存标头

我正在使用重写规则来设置环境变量,然后尝试基于该变量设置缓存控制标头。但是,似乎变量在过程中被设置得太晚了或什么东西;条件头规则永远不会被执行。

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块的组合,但没有成功。

回答

19

使用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 

更多获得BY睁眼不同的答案:

asset环境变量被重定向后更名为REDIRECT_asset,所以你的条件标题指令必须是:

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

是,就是这样,REDIRECT_asset,谢谢他。 – regilero

+0

谢谢,不知何故,我错过了这个答案。 – mike