mod_rewrite RewriteCond基于Last-modified? (htaccess的)

时间:2009-08-23 08:59:21

标签: .htaccess mod-rewrite httpresponse last-modified

我知道我们可以轻松地将RewriteCond基于任何http 请求标头。但是,我们可以检查(某些)要发送的响应标头吗?特别是最后修改一个?

我想仅在Last-modified日期超过30分钟时重写一个url,并且我试图避免每次请求该目录中的文件时将该检查委托给php文件的开销。< / p>

提前致谢!

3 个答案:

答案 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?听起来你正试图推出自己的缓存......