我知道我们可以轻松地将RewriteCond基于任何http 请求标头。但是,我们可以检查(某些)要发送的响应标头吗?特别是最后修改一个?
我想仅在Last-modified日期超过30分钟时重写一个url,并且我试图避免每次请求该目录中的文件时将该检查委托给php文件的开销。< / p>
提前致谢!
答案 0 :(得分:9)
不,那是不可能的。但您可以使用rewrite map从程序中获取该信息,其开销比PHP少,可能是shell脚本。
以下是bash脚本示例:
#!/usr/bin/env bash
while read line; do
max_age=${line%%:*}
filename=${line#*:}
if [[ -f $filename ]]; then
lm=$(stat -f %m "$filename")
if [[ $(date +%s)-$lm -le $max_age ]]; then
echo yes
else
echo no
fi
else
echo no
fi
done
重写映射的声明需要放在您的服务器或虚拟主机配置文件中,因为程序刚启动一次然后等待输入:
RewriteMap last-modified-within prg:/absolute/file/system/path/to/last-modified-within.sh
然后你可以使用这样的重写映射(.htaccess示例):
RewriteCond %{last-modified-within:30:%{REQUEST_FILENAME}} =yes
RewriteRule ^foo/bar$ - [L]
RewriteRule ^foo/bar$ script.php [L]
答案 1 :(得分:0)
出站标头在much
晚于mod_rewrite
行动之前不存在。 mod_rewrite
中内置的文件修改时间检查功能也没有,所以最接近你使用它的是RewriteMap外部重写程序,以查明文件是否存在有问题已被修改。
如果我正确理解您的应用程序,您还可以考虑让cron作业删除该目录中超过30分钟的文件,然后重写文件不存在的条件。
答案 2 :(得分:0)
您是否考虑过使用mod_proxy,mod_cache和/或squid?听起来你正试图推出自己的缓存......