有条件地在apache中设置缓存头

时间:2011-10-18 19:12:49

标签: apache caching mod-rewrite mod-headers

我想根据访问的路径文件有条件地设置缓存头。基本上,访问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

有更好的方法吗?我尝试了一些目录和位置块的组合但没有成功。

1 个答案:

答案 0 :(得分: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 set Cache-Control "max-age=31536000" env=REDIRECT_asset